通过统计nginx访问日志禁止恶意抓取数据的实现

nginx默认会记录客户端访问服务端的日志,默认的目录位于:/var/logs/access.log;

业务需求:每小时读取access.log内容,统计每个ipd访问系统次数,如果超过指定次数,则将该ip加入到防火墙中,以便禁止其继续访问(后续可以考虑不是禁止其访问服务,而是重定向到指定的页面)。这样避免别人恶意从自己网站上抓取数据


#-*-coding:utf8 -*-
import logging,datetime,os,sys,string,re
reload(sys)
sys.setdefaultencoding('utf8')
logging.basicConfig(level=logging.DEBUG, \
                    format='%(asctime)s %(levelname)s- %(message)s', \
		    filename='/data/analyse.log', \
                    datefmt='%m-%d %H:%M', \
                    )
#单位时间内允许最大有效访问次数
maxallowednum=500
ipDic={}
pip = re.compile('[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}')
ptime = re.compile('[0-9]{1,2}:[0-9]{1,2}:[0-9]{1,2}')
logfilepath = '/var/log/nginx/access.log'
#该文件记录上次访问到的日志行数
tmpfilepath ='/data/tmp'

linenum = string.atoi(open(tmpfilepath,'r').read())
#读取文件总行数,如果总行数小于tmp文件中记录的行数,说明该日志文件微新增的日志文件,则需要从第一行开始读取
loglinenum = len(open(logfilepath,'rU').readlines())
if(loglinenum<linenum):
    linenum = 1

logging.debug('linenum is:%s',linenum)

logfile = open(logfilepath,'r')
tmpfile = open(tmpfilepath,'w')

index = 0
line = logfile.readline()
while(line!=''):
    if(index>=linenum):
        #print line
  	 mip = pip.search(line)
	 #mtime = ptime.search(line)
	 if mip:
	     ip = mip.group()
             #将每个ip的有效请求存放在ipDic字典中
	     if(line.find('/static/')==-1):
 	         if(ipDic.has_key(ip)):
	             ipDic[ip] = ipDic[ip]+1
                 else:
		     ipDic[ip] = 1

	     #times = mtime.group()
	     #logging.debug('%s' %(ip))
    
    line=logfile.readline()
    index+=1

logging.debug('new line num:%i'%(index))
tmpfile.write(str(index))
tmpfile.close()
logfile.close()
#循环ip字典,将其中访问次数超过最大允许访问次数的ip加入到防火墙,禁止其继续访问
for k,v in ipDic.items():
    if(v>=maxallowednum):
        logging.debug('ip:%s visited %i times,add to iptables' %(k,v))
        os.system('iptables -I INPUT 1 -s '+k+' -j DROP') 
    else:
	logging.debug('ip:%s visited %i times' %(k,v))

logging.debug('-------------------------over------------------------------') 


也可一去我的个人站点 查看
或者,欢迎关注俺的微信订阅号,每天一篇小笔记,每天提高一点点:
公众好:enilu123


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值