簡単な入力フォームこそ気を付けよう 
phpで作る入力フォームでやってしまいがちな事を紹介します。
入力した情報を確認画面で表示させる、というよくあるパターン。
(ベタ書きで失礼します。)
▼form.php(入力画面)
<form method="post" action="./confirm.php"> ニックネーム: <input type="text" name="title" value="" /><br /> <input type="submit" value="送信" /> </form>
▼confirm.php(確認画面)
< ?php
if(isset($_POST['title']) && $_POST['title']){
echo htmlspecialchars($_POST['title']);
}else{
echo '未入力';
}
?>
これ、一見問題無さそうですが、ある文字を入力すると未入力と表示されてしまいます。
そうです。
0(ゼロ)です。
TRUEかFALSEかで判断しているため、post送信された0はFALSEとして見なされます。
なのでこうやりましょう。
▼confirm.php(確認画面)
< ?php
if(isset($_POST['title']) && $_POST['title'] != ''){
echo htmlspecialchars($_POST['title']);
}else{
echo '未入力';
}
?>
どうしても「0」という名前で登録したいんだ!というお客様がいないとも限りませんからね。。
さて、もう一つ紹介します。
クロスサイトスクリプティング(XSS)のお話です。
今度は同じphpファイル自身にpost送信するパターン。
▼http://example.com/test.php
< ?php // なんらかの処理 ?> <form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>"> … </form>
action先に何の迷いも無く
$_SERVER['PHP_SELF']
と書くと、実はこれが結構危ないのです。
他のhtmlファイルで下記のようなソースを書き、上記のスクリプトへのリンクを貼りましょう。
そして、クリックしてみましょう。(攻撃!)
<a href="http://example.com/test.php/%22%3E%3Cscript%3Ealert('xss');%3C/script%3E/">攻撃</a>
JavaScriptが実行され、アラートが表示されるかと思います。
URLの後半部分はURLエンコードされたものです。
$_SERVER['PHP_SELF']は、渡されたURIのホスト部分の後から、
GETクエリ部分の前まで(?の前まで)をURLデコードした形で格納します。
つまり、$_SERVER ['PHP_SELF']は、
/test.php/"><script>alert('xss');</script>/
となるので、
<form method="post" action="/test.php/"><script>alert('xss');</script>/">
となり、JavaScriptが実行されてしまうわけです。
では結論。
このようにしましょう。
</form><form method="post" action=""> … </form>
<form method="post" action="<?php echo $_SERVER['SCRIPT_NAME']; ?>"> … </form>
<form method="post" action="<?php echo htmlspecialchars($_SERVER['PHP_SELF']); ?>"> … </form>
空にしてあげるのが一番ラクかと思います。