リモートファイルインクルードを阻止
2007年8月22日
先日、リモートファイルインクルードを狙った不正アクセスが多い件について書いた。これらの不正アクセスによるクラッキングは当然ながら失敗しているのだが、一日100件ほどあるこういった不正アクセスにサーバのリソースが消費されていることを考えると馬鹿馬鹿しいので、やはり対策をしたほうがいいだろう。
index.php の冒頭に、次のコードを挿入した。
『http://』、『ftp://』、『php://』などで始まるリクエストをすべて排除する仕組み。ただし、『query=http://....』『userid=http://....』といったリクエストは例外的に受け付けるようにしてある。
(追記) 攻撃は、このサイトの他のブログにも向けられてきたので、すべてのブログに同じ措置を施した。
(追記 070901 コード改定)クッキー関連で不具合があったので、$_REQUEST から $_COOKIE を削除するルーチンを加えた。
index.php の冒頭に、次のコードを挿入した。
if (isset($_REQUEST) and isset($_COOKIE)) {
foreach($_COOKIE as $key=>$value) {
if (isset($_REQUEST[$key])) unset($_REQUEST[$key]);
}
}
$except=array('query','userid');
check_remote_inclusion($_REQUEST,$except);
function check_remote_inclusion(&$var,&$except){
foreach($var as $key=>$value){
if (in_array($key,$except)) continue;
if (is_array($value)) check_remote_inclusion($value,$except);
elseif (preg_match('!^[a-zA-Z]{1,5}://!',$value,$matches)) {
echo '<html><head><title>ERROR</title><body>';
echo 'Request cannot start from "'.htmlspecialchars($matches[0]).'".';
echo '</body></html>';
exit;
}
}
}
unset($except);『http://』、『ftp://』、『php://』などで始まるリクエストをすべて排除する仕組み。ただし、『query=http://....』『userid=http://....』といったリクエストは例外的に受け付けるようにしてある。
(追記) 攻撃は、このサイトの他のブログにも向けられてきたので、すべてのブログに同じ措置を施した。
(追記 070901 コード改定)クッキー関連で不具合があったので、$_REQUEST から $_COOKIE を削除するルーチンを加えた。