2016-05-23 8 views
0

私は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; 
     } 
    ?> 
+0

私は必ずしもお勧めしません(もしあれば)パスワードファイルやシステム構成ファイルなどのセキュリティ保護されたシステムファイルを読み取るためにハッカーが使用することができるfread()を使用します。これは本当にセキュリティの設定がどのようにt彼はサーバを実行しているサーバ – mike510a

+0

数分ごとに実行するシェルスクリプトを作成し、基本的にはban_listの.htaccessファイルを更新するという別の方法があります。 – mike510a

答えて

0

ここでは、これを扱うことができる一つの方法ですサーバからPHPスクリプトを要求するので、htaccessの規則を.phpファイルのみと一致するように少し変更する必要があります。 *とのマッチはとにかく悪い考えですが、この方法はこのようなことを行う最も安全な方法ではありません。 UFWのような無料のファイアウォールに投資したい場合は、リクエストごとではなく、サーバー全体からIPアドレスをブロックすることができます。

ファイアウォールを使用する方が、IPアドレスをブロックする方がはるかに効率的で安全な方法です。

PHPがファイアウォールとして機能する方法は、DDoS攻撃と再帰攻撃に対して脆弱です。たとえば、誰かがページcheck_ip.phpをリクエストした場合はどうなりますか?それはどこかにリダイレクトしなければなりません。したがって、check_ip.phpにリダイレクトされ、check_ip.phpにリダイレクトされ、check_ipにリダイレクトされます。

このメソッドを使用しないでください。このメソッドはデモンストレーション目的であり、ファイアウォールの置き換えではありません。私たちは、この危険なメソッドを使用しなかった場合は理論的には

は、ここで我々はそれを行うだろう方法は次のとおりです。

の.htaccessで

RewriteRule ^([\s\S]+)(.php|.phps)$ /check_banned.php [L] 

... More rewrite rules 

に変更しその後check_banned.phpであなたのような何かを行うことができますこの:

<?php 
$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){ 
    header('HTTP/1.0 403 Forbidden'); 
} 
else { 
    // What to do if ip is not banned? 
    $sPage = $_SERVER["PATH_TRANSLATED"]; 
    if (file_exists($sPage)) { 
      include_once($sPage); 
    } 


} 

?> 

WARNING - ITは、攻撃に対して脆弱なので、このメソッドを使用しないでください - - REMEMBER


編集:OPの編集に対応して、ここではファイアウォールなしIPフィルタリングを行うために1つの安全な方法があります:

ファイルでcheck_banned.php

<?php 
$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){ 
    header('HTTP/1.0 403 Forbidden'); 

    // here is the important change 
    die("script terminated because IP is in ban list"); 
} 
else { 
    // if IP not banned, do nothing. 



} 

?> 

それから、保護したいすべてのPHPスクリプトの最上部で、これを一番上で簡単に行うことができます:

<?php 
    include_once("check_banned.php"); 
?> 

これは基本的に、IPが禁止リストと一致し、何も処理しない場合にスクリプトが "die"コマンドを使用して終了するようにします。そのIPが禁止リストにない場合、ページを読み込み続けます。

私はサイトがこの手法を使用しているのを見ました。ワードプレスサイトは、同様の手法を使用してリクエストごとの前処理を実行するフレームワークの素晴らしい例です。

気をつけなければ、脆弱性のホスト全体を開くことができるので、本当に必要でない限り、私はmod_rewriteルールから離れています。

+0

ありがとうございました。私はhtaccessファイルを 'deny from'という長いリストを使って変更しました。とにかく処理時間に顕著な差はなかった。しばらく前に、私は、Apacheの最新バージョンでは、if-thenステートメントの内部で使用できる変数を含め、htaccessファイルの柔軟性を向上させることを認めました。当時、私のispはこれらの機能を持たない古いバージョンのApacheを使用していました。彼らがアップグレードしたかどうかを確認する必要があります。 – Walt

+0

あなたが*行うことができる方法の1つは、IPチェックコードで別のPHPファイルを作成し、include_once(check_banned.php)を実行することです。すべてのPHPスクリプトの先頭にIPアドレスをフィルタリングしたいなら、die( "message")を使います。 $ _SERVER ["REMOTE_ADDR"]が禁止リストのテキストファイルにある場合、スクリプトを停止するコマンド。 – mike510a

+0

@Waltは本当ですか?その興味深いのはapacheがhtaccessファイルのIF-then-Elseステートメントを持っているということです – mike510a

0

かなりの量のコードが書かれていて(おそらく移動している)、あなたは正しい軌道に乗っていると思います。

私はhttp://www.ip-approval.comを使用して、IPを許可またはブロックする方法を提供しています。また、これらの訪問者を別のページまたはサイトにリダイレクトするオプションもあります。

参照:.htaccessファイルでhttp://www.ip-approval.com/instructions

、私が追加しました:

php_value auto_prepend_file /check_banned.php 

を...サイトのすべてのページにコードを追加しますました。あなたは、フォルダ/ pages.htmlを持っている場合は、フォルダにcheck_banned.phpファイルを追加、または追加することができ、次のいずれか

php_value auto_prepend_file none 

...フォルダ内の.htaccessファイルに、それはそれに追加されることはありませんフォルダ。

だから、あなたははphp_value auto_prepend_fileを望んでいた場合は他の人のよう

OR

を働くだろうが、あなただけの各ページに以下を追加することができます指摘しています

<?php 
    include_once("check_banned.php"); 
?> 
関連する問題