导语

企鹅媒体平台媒体名片页反爬虫技术实践,分布式网页爬虫技术、利用人工智能进行人机识别、图像识别码、频率访问控制、利用无头浏览器PhantomJS、Selenium 进行网页抓取等相关技术不在本文讨论范围内。

Cookie是什么

大家都知道http请求是无状态的,为了让http请求从“无状态” to “有状态” , W3C 在 rfc6265 中描述了整个http协议的状态机制,既从客户端(通常是浏览器)到服务器端的流转过程,cookie 的引入使得 服务器在 接收到请求时可以区分用户和状态。

通过上边这张图,我们可以容易的发现,这个过程就好像“上车打票”一样,有普通票(不记名)和 也月票(“记名的票”),有位伟大的程序员曾经说过“如果你的程序逻辑和实际生活中的逻辑反了,就一定是你错了”。

言归正传,为什么反爬虫

互联网有很多业务或者说网页,是不需要用户进行登录的(不记名的票),你可以简单的认为这其实是一个“不需要记录http状态的业务场景”(注意这里是简单认为,但其实并不是无状态的),那这些不需要登录的页面,往往又会包含大量的聚合信息,比如新闻门户网站、视频门户网站、搜索引擎,这些信息是公开的,其实是可以可以被爬虫抓取的,站长甚至还要做SEO(搜索引擎优化)让搜索引擎或其他网站更多更经常的去收录自己的整站,以便推广,那既然我们要做SEO优化为什么还要 “反爬虫” ?

因为通过程序进行 URL 请求 去获得数据的成本是很低的,这就造成大量抵质量网页爬虫在网络横行,对业务方的服务器造成不必要的流量浪费和资源消耗。

网页爬虫到底有多容易

正常打开的界面内容是这样的

查看网页源代码,看看我们要抓取的目标,这里就不在演示了,然后利用Chrome开发者工具提供的 “Copy as curl”

curl 'https://v.qq.com/' -H 'Pragma: no-cache' -H 'DNT: 1' -H 'Accept-Encoding: gzip, deflate, sdch, br' -H 'Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.6,en;q=0.4' -H 'Upgrade-Insecure-Requests: 1' -H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36' -H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8' -H 'Cache-Control: no-cache' -H 'Cookie: tvfe_boss_uuid=ad12b5df44c4af49; ad_play_index=34; pgv_info=ssid=s9710442890; ts_last=v.qq.com/; pgv_pvid=7925047056; ts_uid=578794400; qv_als=778esxpJSKmr5N0bA11491899166PnRBKw==' -H 'Connection: keep-alive' --compressed

然后你会发现,与“查看网页源代码” 没有区别,说明我们已经成功获得数据内容。

反爬虫效果是什么样的?

我们通过浏览器直接打开下面这个链接 ,会发现请求到的结果是个JSON

现在我们重复刚刚的 “Copy as curl” 的过程,看看是否依然能获得正确结果 ? 答案是否定的,我们来验证一下

curl 'https://media.om.qq.com/media/5054675/list' -H 'pragma: no-cache' -H 'dnt: 1' -H 'accept-encoding: gzip, deflate, sdch, br' -H 'accept-language: zh-CN,zh;q=0.8,en-US;q=0.6,en;q=0.4' -H 'upgrade-insecure-requests: 1' -H 'user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36' -H 'accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8' -H 'cache-control: no-cache' -H 'authority: media.om.qq.com' -H 'cookie: signiture=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJkYXRhIjpbXSwiZWkiOjUsInN0IjoiMTQ5MTg5OTczNjQ3NyIsImlhdCI6MTQ5MTg5OTc0M30.fTAsbJZNOTsHk0QoLfZIA-AXhO6ezaCOiCTj8lYCqO4; tvfe_boss_uuid=ad12b5df44c4af49; pgv_info=ssid=s9710442890; pgv_pvid=7925047056; omuisid=eyJ1aWQiOiI5ZGVjMjRiN2UxM2FiNGUyZWJjNWRhMGU1N2EyYTRkZSJ9; omuisid.sig=5wAr5khpxGvFDp3WpkJ6_QX9iE4' -H 'referer: https://media.om.qq.com/media/5054675/list' --compressed

我们会发现得到的是一个网页而不是 JSON,命中了反爬虫逻辑

到底发生了什么?

前面提到了 “不记名票据” 和 因推广需求网站不需要登录的场景,那针对这样的情况,是否我们就真的不需要对请求进行签名呢 ? 答案是否定的,不花钱或花很少的钱就可以免费进入公园游玩了,游客可能本身是感受不到“票据”的存在,但其实我们还是需要对用户进行标记,这里发散一下,其实统计网站在追踪pv/uv时也是进行了类似的“标记”,下面我们通过一张图来描述下上面请求发生的过程

这里我们有两次签名过程,一次在服务器端进行,一次在客户端进行,因为在这个页面是不需要用户登录,所以在服务器端进行签名,对于爬虫来说是一个几乎没有成本的过程,它可以每次来“园子”里玩的时候,都申请一张新的票,伪装成为一个“新的用户”,为了应对如此低廉的成本,我们增加“客户端进行签名”的流程,有人说“客户端签名是不靠谱的,因为你的代码别人都是可以看到的是可以破解的”,这个地方的客户端签名不是为了数据安全,而是为了增加爬虫进行抓取的成本,因为一般网页爬虫都不具备 js 之行能力,这样就增加了它抓取的成本。

另外一点,签名虽然是由客户端签发的,但是却是由服务器端进行验证,我们这里是利用 JWT(JSON WEB TOKEN) 进行了 encode和decode过程,且通过将服务器时间对客户端进行下发,完成有效期控制。

起到一定的防DDOS攻击的效果

通过上图我们可以看到,关键就是两次票据的签发与验证,一次由浏览器签发,一次由后台签发,但是验证真伪都是在服务端进行,这样做的最终效果就是,要对我们的界面进行抓取或攻击的人,必须按照我们设定的套路运转,就会增加他下载js并执行我们js的过程,如果有攻击方利用xss 获的肉机,对我们的域名发起攻击时,由于我们有两次票据验证,而去其中有一个票据的有效期时间很短,基本上不太可能对我们的服务器造成连续伤害了。

如果网页抓取人,通过使用完全模拟浏览器的运行环境的第三方软件(PhantomJS、Selenium,WEBDRIVER)对我们进行抓取,其实效率是很慢的,基本上需要5-6秒完成一次, 基本上比一个真实的用户打开网页还要慢很多,对于这种可以当成是真是用户一样对待,数据本来就是开放的

接入这套反爬、防DDOS逻辑后,从模调系统查看数据后台服务被击穿的现象已经完成消失,异常流量已被隔离。

反爬虫和抗DDOS攻击技术实践的更多相关文章

  1. 网易云易盾与A10 Networks达成战略合作 携手打造抗DDoS攻击的解决方案

    欢迎访问网易云社区,了解更多网易技术产品运营经验. 2018年9月,网易云易盾宣布,与智能和自动化网络安全解决方案提供商A10 Networks结成战略合作伙伴关系.双方将在抗DDoS攻击领域展开深入 ...

  2. 抗DDOS应急预案实践-生产环境总结-建议必看

    一.首先摸清楚环境与资源 为DDoS应急预案提供支撑 所在的网络环境中,有多少条互联网出口?每一条带宽多少? 每一条互联网出口的运营商是否支持DDoS攻击清洗,我们是否购买,或可以紧急试用?当发生DD ...

  3. 抗DDOS攻击

    2016年10月的某天,“半个美国互联网”都瘫痪了,就是因为遭受了DDoS攻击——Twitter.GitHub.Spotify.Airbnb.Etsy等大量站点都因此受到影响.DNS服务提供商Dyn公 ...

  4. 记一次解决非法参数DDoS攻击的实践

    起因 线上项目突然遭到大量的非法参数攻击,由于历史问题,之前的代码从未对请求参数进行校验. 导致大量请求落到了数据访问层,给应用服务器和数据库都带来了很大压力. 针对这个问题,只能对请求真正到Cont ...

  5. 漫画告诉你什么是DDoS攻击?

    本文作者:魏杰 文章转载自:绿盟科技博客,原文标题:看ADS如何治愈DDoS伤痛 根据<2015 H1绿盟科技DDoS威胁报告>指出,如今大流量网络攻击正逐渐呈现增长趋势,前不久锤子科技的 ...

  6. 怎样预防Ddos攻击

    一.为何要DDOS? 随着Internet互联网络带宽的增加和多种DDOS黑客工具的不断发布,DDOS拒绝服务攻击的实施越来越容易,DDOS攻击事件正在成上升趋势.出于商业竞争.打击报复和网络敲诈等多 ...

  7. DDOS攻击(流量攻击)防御步骤

    DDOS全名是Distributed Denial of service (分布式拒绝服务攻击),很多DOS攻击源一起攻击某台服务器就组成了DDOS攻击,DDOS 最早可追溯到1996年最初,在中国2 ...

  8. 什么是DDoS攻击?DDoS防御的11种方针详解

    对于遭受DDOS攻击的情况是让人很尴尬的,如果我们有良好的DDoS防御方法,那么很多问题就将迎刃而解,我们来看看我们有哪些常用的有效地方法来做好DDoS防御呢. 对于DDoS防御的理解: 对付DDOS ...

  9. 浅谈 DDoS 攻击与防御

    浅谈 DDoS 攻击与防御 原创: iMike 运维之美  什么是 DDoS DDoS 是英文 Distributed Denial of Service 的缩写,中文译作分布式拒绝服务.那什么又是拒 ...

随机推荐

  1. Java NIO(一)I/O模型概述

    基本概念讲述 什么是同步? 同步就是:如果有多个任务或者事件要发生,这些任务或者事件必须逐个地进行,一个事件或者任务的执行会导致整个流程的暂时等待,这些事件没有办法并发地执行. 什么是异步? 异步就是 ...

  2. Alias自定义命令

    [root@localhost etc]# type home    --检查是否占用-bash: type: home: not found[root@localhost etc]# alias h ...

  3. 数据库分库分表和带来的唯一ID、分页查询问题的解决

    需求缘起(用一个公司的发展作为背景) 1.还是个小公司的时候,注册用户就20w,每天活跃用户1w,每天最大单表数据量就1000,然后高峰期每秒并发请求最多就10,此时一个16核32G的服务器,每秒请求 ...

  4. Disruptor时序调用

    接下来,我会对disruptor的设计和源码上进行讲解,先来一篇时序图,简单理解下disruptor的工作过程

  5. linux 虚拟机 磁盘空间压缩

    /usr/bin/vmware-toolbox-cmd disk list /usr/bin/vmware-toolbox-cmd disk shrink / init 0

  6. Scala-列表操作

    package com.bigdata object ListO { def main(args: Array[String]): Unit = { println() } val list = Li ...

  7. 一些漂亮的js库

    http://tympanus.net/Development/ModalWindowEffects/ http://js1k.com/2013-spring/demos http://dimseme ...

  8. JavaWeb基础—XML学习小结

    一.概述 是什么? 指可扩展标记语言 能干什么? 传输和存储数据 怎么干? 需要自行定义标签. XML 独立于硬件.软件以及应用程序 通常.建立完xml文件后首要的任务是:引入约束文件! 二.XML简 ...

  9. WPF的单位 屏幕 分辨率

    原文:WPF的单位 屏幕 分辨率 WPF程序中的单位是与设备无关的单位,每个单位是1/96英寸,如果电脑的DPI设置为96(每个英寸96个像素),那么此时每个WPF单位对应一个像素,不过如果电脑的DP ...

  10. jQuery学习-显示与隐藏

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...