-3

私はこれに似たようなことをしたいと思っています: PHP 5 で IP を CIDR マスクに一致させますか?

ただし、許可されていない IP/マスクのリストを MySQL テーブルに保存し、一致を確認したいと考えています。

リンクの例と同じように、「10.2.0.0/16」のようなものがテーブルの行になり、現在のユーザーの IP アドレス ($_SERVER['REMOTE_ADDR']) を確認して、一致するかどうか。

どうもありがとう :)

4

2 に答える 2

3

テーブルのいくつかのオプション-IPを人間が読める文字列(4ドットバイト)として、またはcidr_matchが使用するネイティブの長い数値として保存できます。cidr_match人間が読める形式(リンクされたページから再利用するため)に固執していると仮定します

function testIP($ip=$_SERVER['REMOTE_ADDR']) {
    //Returns TRUE - valid, FALSE - denied

    /* Get the data from the database and return it in rows
     * this could be real-time retrieved, or pulled into an array
     * first
     * assumes: deny_ranges(ip VARCHAR(45) not null,mask INT not null default 0)
     * eg: $denyips= get "SELECT ip,mask FROM deny_ranges" from database
     */

    foreach($denyips as $row) {
        if ($row["mask"]==0) {
            //No need to use overhead of CIDR_MATCH
            //Exact match - reject
            if ($row["ip"]==$ip) return false;
        } elseif (cidr_match($ip,$row["ip"]."/".$row["mask"])==true) {
            //In denied range - reject
            return false;
        }
    }
    //Got through all rejected ranges+ips - it's good
    return true;
}

cird_match(他の投稿で見つけることができます)

于 2010-08-30T17:22:17.790 に答える
0

の php.net ドキュメントにip2long()は、コメントに動作するコードの良い例があります: http://www.php.net/manual/en/function.ip2long.php#86793

于 2009-10-30T03:54:31.823 に答える