Nucleus

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に次のコードを追加することで、対処した。
// 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)

さらにサーバログを見ると、&amp;を含むURIのアクセスも禁止してよいことに気がついた。と言うのは、amp;xxxx=yyyyというリクエストは、シンタックスエラーであるから。

/(#|\?[^\?]*\?|&amp;)/

でよいはず。

コメント送信