如何跟踪IP以阻止恶意用户?

时间:2016-07-08 22:07:17

标签: php database security http ip

以下是一些获取用户IP的理论

理论1:如果您不使用负载均衡器,请使用REMOTE_ADDR。如果您使用负载均衡器,请使用它使用的任何内容。 99%的案例似乎是HTTP_X_FORWARDED_FOR。所以:

function get_ip_address(){
    $id = '';
    if (isset($_SERVER['REMOTE_ADDR']))
        $ip = $_SERVER['REMOTE_ADDR']; 
    else if (isset($_SERVER['HTTP_X_FORWARDED_FOR']))
        $ip = $_SERVER['HTTP_X_FORWARDED_FOR']; 
    else
        $ip = 'UNKNOWN';
    return $ip;
}

理论2:还有一些其他HTTP标头信息(即。$_SERVER['HTTP_...]可能包含IP。所以:

function get_ip_address(){
    foreach (array('HTTP_CLIENT_IP', 'HTTP_X_FORWARDED_FOR', 'HTTP_X_FORWARDED', 'HTTP_X_CLUSTER_CLIENT_IP', 'HTTP_FORWARDED_FOR', 'HTTP_FORWARDED', 'REMOTE_ADDR') as $key){
        if (array_key_exists($key, $_SERVER) === true){
            foreach (explode(',', $_SERVER[$key]) as $ip){
                $ip = trim($ip); // just to be safe
                if (filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE) !== false){
                    return $ip;
                }
            }
        }
    }
}

理论3:同时存储$_SERVER['HTTP_...]$_SERVER['REMOTE_ADDR']中的一个。所以有两个变量:

function get_ip_address(){
    foreach (array('HTTP_CLIENT_IP', 'HTTP_X_FORWARDED_FOR', 'HTTP_X_FORWARDED', 'HTTP_X_CLUSTER_CLIENT_IP', 'HTTP_FORWARDED_FOR', 'HTTP_FORWARDED') as $key){
        if (array_key_exists($key, $_SERVER) === true){
            foreach (explode(',', $_SERVER[$key]) as $ip2){
                $ip2 = trim($ip2); // just to be safe
                if (filter_var($ip2, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE) !== false){
                    $ip1 = $_SERVER['REMOTE_ADDR'];
                    return array($ip2, ip1);
                }
            }
        }
    }
}
老实说,我有点困惑。我需要多少列(在数据库中)来存储用户的IP?我的意思是我应该同时存储REMOTE_ADDRHTTP_...吗?或者只是其中一个?

实际上我有一个查询,它在数据库中每个页面加载时插入用户的IP。因此,每次加载页面之前都会执行该查询。肯定是INSERT查询(每次请求,每个用户)都有成本。所以我不希望它变得毫无用处。我的意思是我想存储一个正确/真实的IP,或者至少我想做最好的工作,可以检测到用户的IP *。

*当用户使用像HSS这样的代理时,检测他是不可能的。这就是为什么我说"至少"。

好吧,哪种理论最好?

2 个答案:

答案 0 :(得分:2)

您需要决定何时存储IP,无论您是否信任发送X-FORWARDED-FOR地址的远程地址。如果这样做,则存储转发的地址,否则存储远程地址。所以它可能是这样的:

$load_balancer = '10.20.30.40';
$ip = $_SERVER['REMOTE_ADDR'];
if (isset($_SERVER['X_FORWARDED_FOR'] && $ip = $load_balancer) {
    $ip = $_SERVER['X_FORWARDED_FOR'];
}

然后在数据库中记录$ip

我也没有看到将负载均衡器IP存储在数据库中的任何意义。在处理数据库数据时执行信任检查需要您使用另一个表来说明负载均衡器IP在不同时间段内的作用。

答案 1 :(得分:0)

我认为对于stackoverflow上的这个问题已经有了一个非常好的答案,所以我不会详细说明选择哪个值。 见https://stackoverflow.com/a/15699240/6543678

我会注意到有关记录用户IP地址的两件事。

首先,您应该使用一些nosql数据库来完成此任务。 您可以将其配置为日志后端,并简单地调用类似\ Log :: info(“{$ip} login as {$email}”,\ Log :: GROUP_IP)或类似的东西,这将很容易使用,以后在db中搜索你。

另一方面,从我的观点来看,log ip根本没有帮助。 实施良好的策略以避免机器人(例如谷歌验证码),禁止积极用户的帐户。 真正的黑客知道如何隐藏他们的ip。使用好的代理很容易,你可以使用被黑的个人电脑/服务器,使用tor或许多其他方式隐藏你的身份。

如果你的真正目标是保护你的网站,请不要在登录ip上浪费太多时间。