获取用户IP并对照屏蔽列表进行检查


get users ip and check against block list?

当用户访问我的站点时,在数据库中记录他们的IP地址,这是防止欺诈/垃圾邮件的预防措施。

我使用这个查询来存储用户ip
 $sql = "INSERT INTO ptb_sessions (session_id, user_ip, session_start, date, session_end) VALUES (NULL, '" . $_SERVER['REMOTE_ADDR'] . "', UTC_TIMESTAMP(), ADDDATE(), NULL);";
                mysql_query($sql, $connection);

我现在想做的是有一个脚本,当获得ip时,执行检查,看看这个ip地址是否存在于我的表ptb_blocked_users中,如果存在,将用户重定向到被阻塞的页面。

我可以这样做吗?

$result = mysql_query("SELECT id FROM mytable");
if(mysql_num_rows($result) == " . $_SERVER['REMOTE_ADDR'] . ") {
     // row not found, show page..
} else {
    // block page
}
谁能告诉我该怎么做呢?

Thanks in advance

您应该花一些时间分析您的数据。IP地址不是静态的,即使在会话中也是如此。此外,当你处理IP地址时,把它们当作数字来处理要简单得多。

虽然要做到万无一失还有很长的路要走:

CREATE TABLE block_list
(
   trunc_ip INT(4),
   added TIMESTAMP
   PRIMARY KEY (trunc_ip)
);

块:

INSERT INTO block_list (trunc_ip)
VALUES (256*FLOOR(INET_ATON('" . $_SERVER['REMOTE_ADDR'] . "')/256);

和检查阻塞:

SELECT 1 AS isblocked
FROM block_list
WHERE trunc_ip=(256*FLOOR(INET_ATON('" . $_SERVER['REMOTE_ADDR'] . "')/256);

…允许你黑掉一个8位子网。

但是有更好的解决方案包括:

  • 需要经过验证的电子邮件地址
    • 对电子邮件服务提供商使用openId和/或
    • 不允许在电子邮件被验证之前发布
  • 浏览器指纹

当你想要检查IP是否在阻塞的数据库中存在时,

    $ip_addres=$_SERVER['REMOTE_ADDR'];
    $query="SELECT `ip` FROM `ptb_blocked_users` WHERE user_ip='$ip_addres'";
    $result=mysql_query($query) or die('query failed');
    if(mysql_num_rows($result)>0)
    {
    //redirect to block page
    }
    else
    {
       //continue to script
    }

对于IPv4和IPv6支持使用inet_pton()和inet_ntop(),这些从PHP 5.1+开始可用,并完全模仿等效的MySQL函数。

否则只需使用ip2long()和long2ip()。

ip2long()和long2ip()函数应该可以工作

的例子:

var_dump(ip2long('209.85.227.147'));
var_dump(long2ip(3512066963));
使用:

INSERT table(ip) VALUES (INET_ATON('192.168.0.1')); /*ip = 3232235521*/
SELECT INET_NTOA(ip) As IPAddress FROM table; /*IPAddress = 192.168.0.1*/

像这样应该可以工作

$sql = mysql_query("SELECT user_ip FROM ptb_blocked_users WHERE user_ip = '" . $_SERVER['REMOTE_ADDR'] . "' ");
if(mysql_num_rows($sql) > 0) {
 die(header("location: url"));
}