脚本宝典收集整理的这篇文章主要介绍了php – 使用MySQL的通配符IP禁止,脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
基本上我目前的表是:
ip_blacklist(id,ip,date)
$sql = "SELECT ip From ip_blacklist WHERE ip = ? LIMIT 1" $query = $this->db->query($sql,array($ip)); if($query->num_rows() > 0){ // Gotcha }
现在..这工作正常,但我希望能够在数据库中输入通配符IP范围,如:
42.21.58.* 42.21.*.* 53.*.*.*
怎么做?
提前致谢.
说,你想禁止192.168.1.0到192.168.1.15,即192.168.1.0/28.
你创建一个这样的表:
CREATE TABLE ban (start_ip INT UNSIGNED NOT NULL Primary KEY,end_ip INT UNSIGNED NOT NULL)
,在那里插入范围:
INSERT INTO ban VALUES (inet_ATON('192.168.1.0'),INET_ATON('192.168.1.0') + POWER(2,32 - 28) - 1)
然后检查:
SELECT ( SELECT end_ip From ban WHERE start_ip <= INET_ATON('192.168.1.14') ORDER BY start_ip DESC LIMIT 1 ) >= INET_ATON('192.168.1.14')
ORDER BY和LIMIT部分是查询有效所必需的.
如前所述,这一次假定非交叉块和一个IP.
如果块相交(例如,您同时禁止192.168.1.0/28和192.168.1.0/24),查询可能会返回错误否定.
如果您想一次查询多个IP(例如,更新具有长IP地址列表的表),那么此查询将是低效的(MysqL不会很好地优化相关子查询中的范围)
在这两种情况下,您都需要将范围存储为LineString,并使用空间索引进行快速搜索:
CREATE TABLE ban (id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,range LINESTRING NOT NULL) ENginE=MyISam; CREATE SPATIAL INDEX sx_ban_range ON ban (range); INSERT INTO ban (range) VALUES ( LineString ( Point(INET_ATON('192.168.1.0'),-1),Point(INET_ATON('192.168.1.0') + POWER(2,32 - 28) - 1),1) ) ); SELECT * FROM ban WHERE mbrContains(range,Point(INET_ATON('192.168.1.14'),0))
以上是脚本宝典为你收集整理的php – 使用MySQL的通配符IP禁止全部内容,希望文章能够帮你解决php – 使用MySQL的通配符IP禁止所遇到的问题。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。