最近又需要做一个简单的ip访问限制。这一次经别人提醒,学到了另外一种方法去实现。这次是用memcache实现的。
需求:限制单个ip地址单位时间内的访问次数,比如5分钟内10次。
实现方法1:python + memcache
原理: 分析条件就是要知道这个ip在哪段时间内?当前的访问次数是多少?
准备工作是安装memcache和python的客户端
思路:把ip作为key,把一个unix时间戳和这个ip的访问次数用'-'分隔符一起作为value, set到memcache中。 当一个新的ip地址来的时候先set,然后如果这个ip地址不是第一次来的话,就要判断做3个逻辑。
第一个:如果这个ip在单位时间内访问次数已经等于或者大于限制的次数的话就返回True表示要限制这个ip地址的访问次数了。
第二个:如果这个ip地址在单位时间内访问次数没有超过限制次数,那么就访问次数+1
第三个:如果这个ip地址超过了单位时间内仍然没有超过限制,那么就把当前unix时间刷新到value中,并把访问次数置为1.
以下是实现代码:
import memcache
def ip_limit(ip):
'''
return True if need to limit ip, otherwise return False
'''
sep = '-'
mc = memcache.Client(['127.0.0.1:11211'], debug=0)
now = int(time.time())
value = mc.get(ip)
if not value:
#set this ip the first time to access
#format is time-count
v = '%s%s%s' % (str(now), sep, '1')
mc.set(ip, v)
return False
else:
#last_access_time and access_times is string
value_list = value.split(sep)
#now last_access_time and access_times is int
last_access_time, access_times = int(value_list[0]), int(value_list[1])
if (now - last_access_time) <= config.IP_COLD_TIME and access_times >= config.IP_MAX_ACCESS_TIMES:
return True
elif (now - last_access_time) <= config.IP_COLD_TIME:
access_times += 1
mc.set(ip, '%s%s%s' % (str(last_access_time), sep, str(access_times)))
return False
else:
mc.set(ip, '%s%s%s' % (str(now), sep, '1'))
return False
代码里面的config是一个config.py文件,用配置的方式配置多长时间(单位:秒)IP_COLD_TIME 和 要限制的访问次数
IP_MAX_ACCESS_TIMES, 方便随时可以修改。
实现方法2: 用python+数据库mysql
具体: 建立一张ip表,表结构很简单:ip_table(ip, varchar 20, access_time int)
查询有没有在单位时间内超过限制次数的逻辑大概如下:
def limit_ip(ip, now):
"""
return True if need to limit ip,otherwise return False
@ip: ip address that is 'xxx.xxx.xxx.xxx'
@now: unix time, int
"""
sql = """SELECT COUNT(*) AS times FROM ip_table WHERE ip = %s and access_time > %s and access_time < %s"""
access_times = conn.query(sql, (ip, now - config.IP_COLD_TIME, now))[0]["times"]
if access_times < config.IP_MAX_ACCESS_TIMES and access_times >= 0:
return False
return True
插入ip就很简单了,直接insert就可以 了。
欢迎有其他ip限制方法的分享和有经验的童鞋拍砖!
分享到:
相关推荐
对于nginx做ip限制一些总结。
java 动态换ip限制 ip频繁限制
PHP限制国内IP,PHP限制IP,PHP限制IP段
php限制ip访问次数.txt php限制ip访问次数.txt php限制ip访问次数.txt php限制ip访问次数.txt
IP访问限制ASP程序(可加入后台) 1.0 介绍: #fceywz_ip 文件夹:数据库文件夹 里面的#fceywz_ip.asa是ACCSEE2003数据库 ip.asp 管理可访问网页的IP地址管理; ip_tj.asp 添加新的IP地址; ip_xg.asp 修改IP...
修改 zookeeper 3.4.14 源码,添加黑、白名单功能。
对于一个IP段区域做限制访问,譬如,对校院站点资源限制校园以外的电脑访问.
linux 系统ip访问限制教程
iis7,iis7.5外置模块增加iis动态ip地址限制。。。。。
如果想禁止指定的ip或者主机名来拒绝某些机器访问,或者指定某些机器来访问。
IP地址过滤限制系统 IP地址过滤限制系统
php限制访问ip
网站ip限制访问代码,是我从网上特意整理出来的。希望对大家有用。
后台IP限制系统V2.0 脚本编写:loke 主页:www.loke.com.cn 这个系统写到2.0后个人感觉再扩展下去也没什么意义了,本人也没有兴趣把这个所谓的系统搞成网站的一个安全体系,当然如果以后有机会还是会去尝试的。。。...
解决IP限制改密码的方法解决IP限制改密码的方法解决IP限制改密码的方法解决IP限制改密码的方法解决IP限制改密码的方法解决IP限制改密码的方法解决IP限制改密码的方法
路由器IP限制截图(参考)我是3M的宽带,不知道对大家有用不?
有时候为了安全,很多时候服务器被攻下后,黑客会远程登录桌面,如果我们限制了ip的远程登录限制,这样就更安全了。
心动不如行动,绝对不会后悔的,写这么多我都感觉有点累了,就先这样吧,记得使用以后给个好评哦,做过路过不要错过,为了让你们看到这个资源,我可是写了大半天文字啊,就这样吧,Warp优选IP,解决使用限制!...
一键解除销毁IP-GUARD3.0限制 完全删除版本 开源 供各位研究
Zencart 中国IP限制插件 /******************************限制中国IP浏览网站**访问需要密码******************************/ /*********************************************************************************...