<form action='' method="post">
名前を入力してください<input type="text" name="name" />
<input type="submit" value="送信">
</form>
<?php
if(isset($_POST['name'])){
echo $_POST['name'].'さん';
}
?>
<script>alert('XSS成功');</script>
<script>alert('XSS成功');</script>さん
PHP標準関数であるhtmlspecialcharsを使うことで、HTMLとして解釈される文字列をエスケープすることができます。
<?php
if(isset($_POST['name'])){
echo htmlspecialchars($_POST['name']) . 'さん';
}
?>
上記の出力結果は
<script>alert('XSS成功');</script>さん
<body onload="document.attackform.submit();">
<form name="attackform" method="post" action="http://example.com/bbs/register.cgi">
<input type="hidden" name="title" value="攻撃者が指定した題名">
<input type="hidden" name="article" value="攻撃者が指定した本文">
<input type="submit" value="送信">
</form>
</body>
(上記ソースコードはWikipediaより引用)
<form action="" method="post">
<input type="text" name="title">
<input type="text" name="article">
<input type="hidden" name="token" value="ワンタイムトークン">
</form>
このように隠しフォームで、毎回変わる暗号(ワンタイムトークン)を保持し、セッションにも同一の暗号を保存しておくことで、 双方が一致しているかを確認することで対策することができます。 暗号は予測不能な文字列とし、隠しフォームに予め入力する値はハッシュ値などにしておくとよいでしょう。
ノート
リファラはどこから来たかを知るために使います。主にアクセス解析や広告などに役立ちます。直前に見ていたURLが含まれます。
console.log(document.cookie);
test.php?PHPSESSID=aaaaaaaaaaaaaaa
<?php
$pdoObject = new PDO('mysql:dbname=testbase;host=localhost;port=8889', 'testuser', 'pass');
$pdoStatementObject = $pdoObject->query("SELECT * FROM user WHERE id = '". $_POST['user'] . "' AND pass = '". $_POST['pass'] . "'");
もし、$_POST[‘pass’] に 「’ OR 1 = 1」を入れた場合、実行されるSQL文は
SELECT * FROM user WHERE id = '' AND pass = '' OR 1 = 1