• 网站访问限制


    最近网站一直受到恶意请求和攻击,把最近限制防护历程记录一下:

    1、请求次数超过阈值做限制

        刚开始网站并没有受到攻击,但有一些恶意抓取网站数据的爬虫,为了防止别人抓取本网站数据,做了请求次数限制,具体思路就是,单位时间内,请求次数超过设定的阈值,自动转向验证码页面,验证通过后可以继续访问,这样既不影响正常访问者,也可阻挡机器请求。

        技术实现方式:刚开始的想法时,每次访问请求时,使用数据集记录IP的请求数量和时间,这样做比较麻烦,不但需要定时清空过时的数据,还要对比时间。然后改用缓存模式,缓存本身有过期时间设定,这样就避免了定时清数据的操作,并且速度快,然后使用IP作为key,访问次数作为value。每次访问请求时,根据IP获得缓存数据,如果获不到数据,创建该缓存,同时设定缓存有效期(阈值有效期),如果获得数据,累加访问次数,如果累计的次数超过阈值,转到验证页面,验证成功,阈值清零,可继续访问。

        这样的方式,避免了频率比较高请求,但如果别人用比较低的频率抓取数据,也无法防护。另外由于设置的单位时间内阈值比较高,没有考虑搜索引擎爬虫,后来的经验表明,各种各样的引擎爬虫,爬取的速度频率还是比较高的。

    2、网站受到恶意攻击

        有一天网站突然访问速度很慢,甚至无法访问,然后登录服务器查看服务器状况,发现CPU使用率100%,首先想到的是,可能是代码出现了死循环或者代码质量问题,但最近发布的版本一直很稳定,排除了该可能性。查看系统日志,发现服务器出现大量的数据请求,并且请求的是商品查询页面,整个系统几乎最耗性能的一个操作。还好之前做了数据分离,不直接操作数据库,保证了数据库服务器正常运行。但一个台web服务器还是无法应付几百个IP同时的大量请求(CC攻击),再加上网站有几万的商品,全部请求商品查询页面,网站几乎一下子就瘫痪了。首先想到的是,利用IIS限制IP访问,阿里云服务器竟然没找到该功能,不得已只有利用应用限制,赶紧在程序访问的BeginRequest中做了限制,把这些访问比较多的IP放到黑名单中,总算暂时给限制住了。

        然后联系阿里云客服,看看有没有什么方法做限制,他们推荐了web应用防火墙,每天拦截了上万的Web攻击和CC攻击,总算安稳了一段时间。注意:使用Web应用防火墙之后,系统日志获得不了真正的客户IP,需要在IIS里安装F5XForwardedFor.zip

    3、网站再次受到攻击

        好景不长,网站再次受到攻击,包括恶意的数据抓取,这次IP段更广,并且不在之前的限制名单中,一些IP请求的总次数很少,Web应用防火墙也不再起太多的作用(估计单位阈值达不到触发条件,具体不太清楚触发机制)。我这边分两步走,一是把网站访问限制阈值调的更低,二是限制三位IP,发现大量的IP,前三个都是相同的,唯一不同的是后一位。想到有些限制IP可能是代理,不一定是真正攻击者,不得已,攻击过后,放开限制IP。每次攻击时,重新计算攻击IP,进行限制。

    4、搜索引擎也被限制

        有一天突然发现百度自然搜索中,网站的关键词快照,全部变成了限制请求了(被限制的IP访问,会返回“限制访问”几个字),在历次的攻击中,虽然想到了可能会限制到搜索引擎的爬虫,但想到爬虫不会请求那么频繁,并且限制后就立即放开了,应该影响不了,虽然可以根据UserAgent判断是否为爬虫,但恶意的也可以伪装成搜索引擎爬虫,就想当然的没处理。直接的后果就是导致了订单量直线下降。最后查询快照那天的百度爬虫访问日志,正好当时也被攻击,百度当天的访问量将近3000次,远远超过了阈值,被限制了。

        了解到各个搜索引擎都有自己的特征,比如百度、谷歌,可以利用IP反查是否属于百度、谷歌,360引擎直接给出了爬虫IP,根据各个搜索引擎特征,在限制时做了改动,增加黑名单、白名单、高频率请求三种组合方式。查询出访问比较高的IP,如果是搜索爬虫特征的,手工验证该IP是否真正属于搜索引擎(利用 nslookup 命令),如果不属于,进入黑名单,否则进入白名单。像360这样的,直接给出IP的,直接放到白名单。

    后记:目前仍在观察中,如果谁有更好的访问限制方法,不吝赐教。

  • 相关阅读:
    ScrollView反弹效果的实现
    Unity 3D本地公布WebPlayer版时"Failed to download data file"解决方式
    win7休眠的开启与关闭方法命令行操作和图文结合的鼠标操作
    使用Javascript D3创建属于你的涂鸦作品
    android获取自己定义控件位置坐标,屏幕尺寸,标题栏,状态栏高度
    [Python]Use Flask-Admin with PostgreSQL
    [LeetCode] Best Time to Buy and Sell Stock
    spring实战五之Bean的自动检测
    FireBug使用总结
    javascript的window.onload()方法和jQuery的$(document).ready()的对比
  • 原文地址:https://www.cnblogs.com/honzhez/p/6255574.html
Copyright © 2020-2023  润新知