DB 挿入をサニタイズし、記述する HTML もエスケープする場合htmlentities($text, ENT_COMPAT, 'UTF-8')
、入力を xss_clean でフィルタリングすることにも意味があるのでしょうか? 他にどのような利点がありますか?
ベストアンサー1
xss_clean()は広範囲で、また愚かです。この機能の 90% は、XSS を防ぐために何もしません。たとえば、単語を検索するalert
が、検索しないなどですdocument.cookie
。ハッカーはこれをエクスプロイトに使用せずalert
、XSS で Cookie をハイジャックするか、CSRF トークンを読み取って XHR を作成します。
ただし、htmlentities()
またはを実行することは冗長です。 が問題を修正し、失敗するhtmlspecialchars()
ケースは次のとおりです。xss_clean()
htmlentities($text, ENT_COMPAT, 'UTF-8')
<?php
print "<img src='$var'>";
?>
簡単な POC は次のとおりです。
http://localhost/xss.php?var=http://domain/some_image.gif'%20onload=alert(/xss/)
これにより、イベント ハンドラーがイメージ タグに追加されますonload=
。この形式の XSS を阻止する方法は、htmlspecialchars($var,ENT_QUOTES);
またはこの場合、xss_clean()
これも防止します。
ただし、xss_clean() のドキュメントから引用すると、次のようになります。
もちろん、100% 完璧なものなどありませんが、フィルターを通過できるものはありませんでした。
そうは言っても、XSSはoutput problem
ないたとえばinput problem
、この関数は変数がすでにタグまたはイベントハンドラ内にあることを考慮できません<script>
。また、DOMベースのXSSを阻止することもできません。次の点を考慮する必要があります。データをどのように使用しているか最適な機能を使用するために、入力時にすべてのデータをフィルタリングすることは悪い習慣安全でないだけでなく、データが破損して比較が困難になることもあります。