私はhtaccessファイルに 'deny from'というエントリがたくさんあります。これらのほとんどは一般的な低オクテットです。.htaccessにPHP IPフィルタを組み込む
htaccessの処理時間を改善するために、禁止されていないIPに対しては、書き換えルールから呼び出されるphpフィルタを実装しようとしています。
マイhtaccessの書き換え規則:
RewriteCond %{REMOTE_ADDR} ^37\.115\. [OR]
RewriteCond %{REMOTE_ADDR} ^46\.118\.
RewriteRule (.*) check_banned.php?ip=%{REMOTE_ADDR}
... More rewrite rules
注、書き換え規則の末尾に '[L]' は存在しません。 IPが禁止されていない場合は、htaccessにルールの処理を続行します。 現在のPHPファイル:
$ip = strip_tags(trim($_GET['ip']));
// Read file with list of banned ips
$file = ban_list.txt;
$myfile = fopen($file, "r") or die("Unable to open file!");
$ban_list = fread($myfile, filesize($file));
fclose($myfile);
// Check if ip is in ban list
$pos = strpos($ban_list, $ip);
if($pos === false) $ip_found = false;
else $ip_found = true;
if($ip_found){
header('HTTP/1.0 403 Forbidden');
}
else {
// What to do if ip is not banned?
}
IPが禁止リストに発見された場合、これは正常に動作しています。しかし、私はIPが禁止されていないケースを処理する方法を見つけることができません。私はちょうど空白のページを得て、ヘッダー '200 ok'で。
また、(。*)をファイルcheck_banned.phpに渡し、PHPコードを関数に変換して、IPが禁止されていない場合に文字列を返すことを考えていました。私はまだこれを試していないことを認めなければならない。 PHPファイルで
RewriteRule (.*) check_banned.php?ip=%{REMOTE_ADDR}&str=$1
:
$string = strip_tags(trim($_GET['str']));
if($ip_found){
header('HTTP/1.0 403 Forbidden');
}
else {
return $string;
}
更新:マイク・Nickaloffへ おかげで、ここではいくつかの調整です。残念ながら私は共有のホスティングアカウントを持っており、サーバーの設定にアクセスすることはできません。
私はphpフィルタスクリプトのファイルアクセス許可を600に設定しましたが、フィルタリングは動作するように見えます。これが脆弱性を処理しますか?
ipが禁止されていない場合、phpスクリプトは要求されたページを読み取り、それをエコーします。もしそれをする必要がないのであれば、htaccessにメッセージを送ってルールを処理し続けるべきであることを示すだけでいいでしょう。
変更がcheck_banned.phpします
は、ページが適切なURL
をロードすることによって要求されたものは何でもPHPの負荷を持っている。これはのみ動作します:
は<?php
ob_start(); // suppress any output
$ip = strip_tags(trim($_SERVER["REMOTE_ADDR"]));
// Read file with list of banned ips
$file = ban_list.txt;
$myfile = fopen($file, "r") or die("Unable to open file!");
$ban_list = fread($myfile, filesize($file));
fclose($myfile);
// Check if ip is in ban list
$pos = strpos($ban_list, $ip);
if($pos === false) $ip_found = false;
else $ip_found = true;
if($ip_found){
ob_end_clean(); // Allow output
header('HTTP/1.0 403 Forbidden');
}
else{
// ip Was not found in ban list
$file = "";
$uri = "";
if(isset($_SERVER["REQUEST_URI"])){
$uri = strip_tags(trim($_SERVER["REQUEST_URI"]));
}
if($uri == "" || $uri == "/")
$file = $_SERVER['DOCUMENT_ROOT']."/index.php";
else $file = $_SERVER['DOCUMENT_ROOT'].$uri;
$myfile = fopen($file, "r") or die("Unable to open file!");
$file = fread($myfile, filesize($file));
fclose($myfile);
ob_end_clean(); // Allow output
echo $file;
}
?>
私は必ずしもお勧めしません(もしあれば)パスワードファイルやシステム構成ファイルなどのセキュリティ保護されたシステムファイルを読み取るためにハッカーが使用することができるfread()を使用します。これは本当にセキュリティの設定がどのようにt彼はサーバを実行しているサーバ – mike510a
数分ごとに実行するシェルスクリプトを作成し、基本的にはban_listの.htaccessファイルを更新するという別の方法があります。 – mike510a