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