危険なXSS対策
ネットで見かけたXSS対策
最近ネットで、次のようなコードでXSS対策を行なっているサイトを見かけました。
$str = preg_replace('/(<script|<iframe|onload=|alert()/u', '', $str);
皆さんはこの実装を見てどう思いましたか?
正直、僕はゾッとしました。
今回は、一部サンプルコードなので、ごく一部のタグしか置換していませんが、 皆さんは全ての危険なタグを消去する完璧な正規表現を書く自信はありますか?
僕はないです。
仮に<scriptのような形で全てのタグを置換できたとしましょう。 でも、しかしこのようなコードや
<
script
このようなもの
<<scriptscript
はどうでしょうか?
前述のものは置換されませんし、後述ものは、置換せれた結果<scriptが生成されてしまいます。
正規表現を緻密なものにしたり、再帰的に置換を行なって行けば理論的には、安全な文字列が生成可能ですが…
それを実装するコストや冗長なテキストを扱う際の処理時間はバカにはできない筈です。
では、どうすれば簡単にXSS対策を行うことができるのでしょうか?
基本対策
XSS対策は、htmlspecialchars関数やフレームワークに実装されている関数などで<や>などの特殊な文字をエスケープするのが基本です。
htmlspecialchars($str, ENT_QUOTES, 'UTF-8');
こうすることでは
<script>alert(1)</script>
のようになり安全な文字列になります。
htmlspecialchars関数だけでは、
<a href="javascript:alert(1)">link</a>
は防ぐことができませんが、 リンクに直接書く場合は、プロトコルスキームやドメインなど正しいURLなのかを確認すべきです。
最後に
大手企業が運営しているサイトでもXSSの脆弱性は報告されています。
XSS攻撃をされてしまいますとCSRF対策を初めとしたほぼ全てのセキュリティ対策が無碍に帰ってしまいます。
大変ですが、不特定多数が更新できる項目を作成する際には、セキュリティ面での注意が必要です。