簡體   English   中英

在存儲之前加密用戶的IP地址

[英]Encrypting user's IP address before storing it

我正在使用PHPMySQL ,我想將用戶的IP地址存儲到數據庫中以進行比較 (例如,每個IP只允許一個標志到一個線程)。 可以通過以下方式進行嗎?

在PHP中檢索它:

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

然后將其作為VARCHAR(32)保存到數據庫中。

如果我必須更全面地使用IP,這不是正確的方法,我想,但如果只是為了確保相同的IP沒有做兩次的事情可以使用md5加密以簡化事物(將IPv4IPv6地址統一為一個)?

是的,這很好,雖然你的術語是錯誤的:這是散列,而散列不是加密。

您還應解析X-FORWARDED-FORClient-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;
}

RE -Edit for IPv6

原則仍然適用,但IPv6轉換已在如何將二進制轉換為二進制存儲在MySQL中進行了回答

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM