2

当用户访问我的网站时,我会在数据库中记录他们的 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
}

有人可以告诉我我会怎么做吗?

提前致谢

4

3 回答 3

1

您应该花一些时间分析您的数据。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 用于电子邮件服务提供商和/或
    • 在验证电子邮件之前不允许发布
  • 浏览器指纹识别
于 2013-05-02T10:48:06.113 回答
1

您可以在每次要检查时检查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*/
于 2013-05-02T10:30:10.413 回答
0

像这样的东西应该工作

$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"));
}
于 2013-05-02T10:30:16.027 回答