当用户访问我的网站时,在数据库中记录他们的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时,检查我的表ptb_blocked_users中是否存在此ip地址,如果是,则将用户重定向到被阻止的页面。
我可以做这样的事吗?$result = mysql_query("SELECT id FROM mytable");
if(mysql_num_rows($result) == " . $_SERVER['REMOTE_ADDR'] . ") {
// row not found, show page..
} else {
// block page
}
有人可以告诉我如何做到这一点吗?
提前致谢
答案 0 :(得分: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*/
答案 1 :(得分: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位子网。
但有更好的解决方案,包括:
答案 2 :(得分: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"));
}