1

Webサイトにブロックしたい(または、もっと良いのはリダイレクトしたい)IPの外部リストがあります。私は最初にこの.htaccessアプローチを採用していましたが、PHPを使用した方が簡単かもしれないことに気づきました。しかし、今はわかりません...PHPとMySQLを一緒に使用するのが最良のオプションのようです。

MySQLにCIDRブロックを保持するテーブルがあります。私はユーザーのIPをテーブルと比較しようと苦労してきました。

最良の方法は何ですか?

私は、ブロックされたIPを何らかの方法でチェックすることを考えていました。たとえば、次のようなものです(PHPおよび擬似コード)。

$user_ip = $_SERVER['REMOTE_ADDR'];

loop through returned rows {
    if ($user_ip in returned row from MySQL table) {
        forward to another domain
    }

    else // do something else...
}

しかし、私はIPのグループを扱っています。単一のIPではありません。私はいくつかのCIDRスクリプトとip2longを使用して、グループを分解および解析してきました。しかし、これは難しいことが証明されています。

コメントからの提案に基づいて、データベースにIPを保存すれば、直接比較することができました。しかし、私が扱っているブロック全体は巨大であり、この方法でそれを行うかどうかはわかりません。私は比較で何百万ものIPを扱っているでしょう...

これを達成するための最善の方法に関する提案はありますか?

4

1 に答える 1

0

私はこれを最終的に整理することができました。これが私がしたことです...

最初に、IP CIDR ブロックの膨大なリストを MySQL に挿入するスクリプトを作成しました。

次に、最初にデータベースにクエリを実行し、IP ブロックをフェッチして配列に収集し、ここにある関数 (特定の IP が CIDR に存在するかどうかを確認する) を使用して、ユーザーの IP を CIDR ブロックと比較するスクリプトを作成しました。データベースから。

// initialize array
$cidr_block = array();

// query mysql database for all id and ip_cidr values
$query = "SELECT id, ip_cidr FROM ip_blocks";

// use mysqli class to query database
if ($result = $mysqli -> query($query)) {

    // build array for testing with  IP_vs_CIDR class
    while ($row = $result -> fetch_assoc()) {
        $cidr_block[] = $row['ip_cidr'];
    }

    // run IP_vs_CIDR on user ip address and cidr block array from database
    $cidr_result = $ip_vs_cidr -> test_user_ip($user_ip, $cidr_block);

    // test ip against the array values and send elswhere if bad
    if ($cidr_result) {
        header('Location: http://www.google.com/');
    }

    // free up result set
    $result -> close();
}

次に、この結果に基づいてリダイレクトしました。ユーザーIPの固定IPを使用したいくつかのテスト(たとえば、$user_ip = '75.150.41.15')正しくテストされ、期待どおりにリダイレクトされた)として、うまく機能しているようです。両方のベースをカバーするために、ブラックリストからのIPとそうでないIPをテストしました.

コメントをお寄せいただきありがとうございます - 参考になりました。

于 2013-03-21T23:57:57.527 に答える