URIに『#』か二つ以上の『?』を含むアクセスを禁止
2008年2月8日
サーバーログを見ていつも思うのだが、『index.php?itemid=123#nucleus_cf』などのURIにアクセスしてくるスパムが結構多い。なぜ『#』を含むURIにアクセスしてくるかは、個別アイテムページのコメントフォームのソースコードを見れば分かる。まともなブラウザなら、こんなことはしない。
また、『index.php?body=http://cracked.site.com/foo.php?』のように、『?』を2つ以上含むURIへのアクセスもある。こちらは、リモートコードインサーションを狙った、クラッキングのトライ。本来ならば、『?』は『%3F』にエンコードされるべきである。
以上の理由から、URIに『#』か二つ以上の『?』を含むアクセスを禁止することにした。index.phpに次のコードを追加することで、対処した。
また、『index.php?body=http://cracked.site.com/foo.php?』のように、『?』を2つ以上含むURIへのアクセスもある。こちらは、リモートコードインサーションを狙った、クラッキングのトライ。本来ならば、『?』は『%3F』にエンコードされるべきである。
以上の理由から、URIに『#』か二つ以上の『?』を含むアクセスを禁止することにした。index.phpに次のコードを追加することで、対処した。
// refuse # and ? in URL if (preg_match('/(#|\?[^\?]*\?)/',$_SERVER['REQUEST_URI'])) { exit("<html><body>URI shouldn't contain '#' and 2x'?'. Please check the browser/robot setting.</body></html>"); }
コメント
kat (2008年2月9日 13:58:15)
さらにサーバログを見ると、&を含むURIのアクセスも禁止してよいことに気がついた。と言うのは、amp;xxxx=yyyyというリクエストは、シンタックスエラーであるから。
/(#|\?[^\?]*\?|&)/
でよいはず。
/(#|\?[^\?]*\?|&)/
でよいはず。