4

私はPHPMySQLを使用しており、比較のためにユーザーの IP アドレスをデータベースに保存したいと考えています (たとえば、IP ごとに 1 つのスレッドに 1 つのフラグのみを許可します)。以下の方法でよろしいでしょうか?

PHPで取得する:

$ipAddress = md5($_SERVER["REMOTE_ADDR"]);

そして、それを としてデータベースに保存しますVARCHAR(32)

IPをより包括的に使用する必要がある場合、これは適切な方法ではないと思いますが、同じIPが何かを2回行わないようにするためだけであれば、md5暗号化を使用しても問題ありません物事を簡素化する ( IPv4IPv6アドレスを 1 つに統合する) には?

4

2 に答える 2

5

はい、これで問題ありませんが、用語が間違っています。これはハッシュであり、ハッシュは暗号化ではありません。

プロキシの背後にいるすべての人を 1 人のユーザー (大企業、高校などのすべての人) であるかのようにブロックしたい場合を除き、ヘッダーX-FORWARDED-FORとヘッダーも解析する必要があります。Client-IP

于 2012-04-29T04:54:55.317 に答える
3

IP を数値に変換することを検討してください。数値データであり、クエリで INET_ATON() と INET_NTOA() を使用できるため、ルックアップが少し速くなります。

http://dev.mysql.com/doc/refman/5.5/en/miscellaneous-functions.html#function_inet-aton

mysql> SELECT INET_ATON('10.0.5.9');
        -> 167773449

http://dev.mysql.com/doc/refman/5.5/en/miscellaneous-functions.html#function_inet-ntoa

mysql> SELECT INET_NTOA(167773449);
        -> '10.0.5.9'

数値に変換する PHP

$ipA = $_SERVER["REMOTE_ADDR"];
$octets = split ("\.", $ipA);
$ipN = ($octets[3] + $octets[2] * 256 + $octets[1] * pow(256,2) + $octets[0] * pow(256,3);

また、この関数で使用している IP アドレスを考慮することもできます。

/* Get Actual IP Address, in spite of proxy server */
function getRealIpAddr() {
    if (!empty($_SERVER['HTTP_CLIENT_IP']))   //check ip from share internet
    {   $ip=$_SERVER['HTTP_CLIENT_IP']; }
    elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR']))   //to check ip is pass from proxy
    {   $ip=$_SERVER['HTTP_X_FORWARDED_FOR']; }
    else
    {   $ip=$_SERVER['REMOTE_ADDR']; }
    return $ip;
}

RE - IPv6 の編集:

原則はすべて引き続き適用されますが、MySQL でのストレージ用に IPv6 をバイナリから変換する方法で IPv6 変換は既に回答されています

于 2012-04-29T14:22:26.723 に答える