我正在使用PHP和MySQL,我想将用户的IP地址存储到数据库中以进行比较(例如,每个IP只允许一个线程标志)。可以通过以下方式进行吗?
在 PHP 中检索它:
$ipAddress = md5($_SERVER["REMOTE_ADDR"]);
然后将其作为VARCHAR(32)
保存到数据库中。
如果我必须更全面地使用 IP,我想这不是正确的方法,但如果只是为了确保同一个 IP 没有做两次某事就可以使用md5
加密来简化事情(将 IPv4 和 IPv6 地址统一为一个)?
是的,这很好,尽管你的术语是错误的:这是散列,散列不是加密。
您还应该解析 X-FORWARDED-FOR
和 Client-IP
标头,除非您想阻止代理后面的每个人,就好像他们是单个用户一样(例如,大公司、高中等的每个人)。
您可能需要考虑将 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;
}
针对 IPv6 的重新编辑:
所有原则仍然适用,但IPv6转换已经在如何将IPv6从二进制文件转换为存储在MySQL中得到了回答