在存储之前加密用户的IP地址

时间:2012-04-29 04:51:46

标签: php mysql ip ipv6 ipv4

我正在使用PHPMySQL,我想将用户的IP地址存储到数据库中以进行比较目的(例如,只允许一个标记到一个线程)每个IP)。可以通过以下方式进行吗?

在PHP中检索它:

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

然后将其作为VARCHAR(32)保存到数据库中。

如果我必须更全面地使用IP,这不是正确的方法,我想,但如果只是为了确保相同的IP没有做两次的事情就可以了使用md5加密来简化操作(将IPv4IPv6地址统一到一起)?

2 个答案:

答案 0 :(得分:5)

是的,这很好,虽然你的术语是错误的:这是散列,而散列不是加密。

您还应该解析X-FORWARDED-FORClient-IP标题,除非您想阻止代理后面的所有人,就像他们是单个用户一样(例如,大公司,高中等所有人)。< / p>

答案 1 :(得分:2)

您可能需要考虑将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 -Edit for IPv6

原则仍然适用,但IPv6转化已在How to convert IPv6 from binary for storage in MySQL

处回答