いまだにこれでXSS対策って言っちゃう男の人って...

私がよく使う方法なんですが、この方法を利用するとXSS脆弱性を限りなくなくすことが出来ます。

対応方法は、PHPファイルの最初に以下のコードを挿入するだけ。

foreach($_GET as $key => $value){
	$_GET[$key] = htmlspecialchars(htmlspecialchars_decode($value,ENT_QUOTES),ENT_QUOTES);
}
foreach($_POST as $key => $value){
	$_POST[$key] = htmlspecialchars(htmlspecialchars_decode($value,ENT_QUOTES),ENT_QUOTES);
}

これで自動的にエスケープの処理を行ってくれます。

通常のXSS対策がエスケープしたくない場所以外はhtmlspecialcharsを利用してでエスケープを行うのに対して、このコードを入れることによりエスケープしたくない場所にhtmlspecialchars_decodeを利用するといった全く逆のアプローチになります。

XSSの脆弱性を限りなくなくす方法 - to-R

私は普段ほとんどPHP使うことは無いから間違ってるかもしれないけど、これはあれだよね、入力時にエスケープしちゃう間違い。


というか、最近よく見かけるえがちゃんって人がこの記事のはてブ

2008年10月24日 hiroyukiegami これはえがい みんなかなりこれ使いやすいよ

とコメント付けてるけど、もしかしてえがちゃんを釣るための餌だった? まぁどっちでもいいけど、

「出力時にエスケープする」っていうのが定石らしいよ。
でもエガミくんのやろうとしたのは「入力時のエスケープ」だね。

http://anond.hatelabo.jp/20081020045037

ってせっかく教えてもらったのにね。なんでそうするのか理解しないとまた同じことの繰り返しだお >id:hiroyukiegami

元記事が追記されてたので、こちらも追記(10/26)

最低限、追記に書かれたようなことは始めから書くべきだったでしょう。でも、それでも私は入力時にエスケープする方法を紹介するのはどうかと思うけどね。

注意点を書いたとしても理解していない人にはなかなか伝わらないもので、「なんか注意書きあったけど、とりあえずこれやっとけばOKなんだね」くらいにしか考えない人は少なからずいて、しかもそういう人はやがて、注意書きがあったことすら忘れて「XSS対策は完璧です!」とか言いかねない。

また、入力時にエスケープする方法を取ったときの問題というのは、その対処がどうしても泥縄的になってしまいます。私は以前、Webアプリのチューニングやメンテナンスをすることがよくあったのですが、入力時にエスケープしてたためにDBに格納する直前にアンエスケープするなんていうことをしてるのをよく見かけました。そのアプリの開発当初は実体参照のままDBに入れてたのが、仕様変更で実体参照のままでは困ることになったとかだったかな。そんな対処が必要になるなら、出力時にエスケープする方がよっぽど楽です。万一対策漏れがあったとしても、漏れたところだけ修正するのはすぐにできるし、万一も許されない厳しい要求がある場合は、入力時のエスケープではそもそも不完全なわけだし、フレームワークでガチガチに固めるとかするしかないわけで。

元記事のはてブにあった 入力時に文字参照に変換するのがよろしくない理由@水無月ばけらのえび日記 はわかりやすくまとまってていいですね。


あと、一応つっこんでおきますが、、、

別に出力時のエスケープと併用しても問題ないかなと思いますし。

XSSの脆弱性を限りなくなくす方法 - to-R

え? それは多重エスケープになりませんか?