一般的知名站点,都有一套比较完善的机器流量检测系统;它通过流量的IP、流量的来源、使用的浏览设备、访问频次、用户行为等综合分析,来判断当前流量是真实的用户流量,还是机器在爬网站的数据,从而做出是否封禁当前流量的决定。第三方统计站点,也是使用此原理来帮助站长统计用户行文的。
而其中的流量来源、使用的浏览设备、甚至流量的IP都是可以伪造的。本文为介绍curl伪装访问来源、和伪装使用的浏览器的方法。伪装来路IP地址,请参考“linux curl命令使用代理服务器”。
一、原理说明:
浏览器与http服务器是通过http协议通讯的,而http请求头中包含了客户端的一些信息,其中包括:浏览器类型、当前页面的来源页面,cookies等;
下面我们来看看一个标准的http请求头后响应头:
curl -v -I --referer http://baidu.com --user-agent 'Chrome/54.0 (Windows NT 10.0)' http://baidu.com/ * About to connect() to baidu.com port 80 (#0) * Trying 180.149.132.47... * Connected to baidu.com (180.149.132.47) port 80 (#0) > HEAD / HTTP/1.1 > User-Agent: Chrome/54.0 (Windows NT 10.0) > Host: baidu.com > Accept: */* > Referer: http://baidu.com > < HTTP/1.1 302 Moved Temporarily HTTP/1.1 302 Moved Temporarily < Server: bfe/1.0.8.18 Server: bfe/1.0.8.18 < Date: Fri, 02 Dec 2016 03:46:11 GMT Date: Fri, 02 Dec 2016 03:46:11 GMT < Content-Type: text/html Content-Type: text/html < Content-Length: 161 Content-Length: 161 < Connection: Keep-Alive Connection: Keep-Alive < Location: https://www.baidu.com/ Location: https://www.baidu.com/ < Expires: Sat, 03 Dec 2016 03:46:11 GMT Expires: Sat, 03 Dec 2016 03:46:11 GMT < Cache-Control: max-age=86400 Cache-Control: max-age=86400 < Cache-Control: private Cache-Control: private < * Connection #0 to host baidu.com left intact
上面输出可以看到,第7行和第9行就是我们设置的浏览器类型字符串和流量来源页面。而httpd服务端接收到了什么呢?我们这里以http服务段使用的是PHP为例,在站点上做一个“test.php”做为测试页面,PHP的Referer、User-Agent存放在$_SERVER变量中,所以我们的“test.php”文件只需要两行代码:
test.php文件:
<?php print_r($_SERVER);
测试返回:
curl --referer http://baidu.com --user-agent 'Chrome/54.0 (Windows NT 10.0)' http://aiezu.com/test.php Array ( [HTTP_USER_AGENT] => Chrome/54.0 (Windows NT 10.0) [HTTP_HOST] => aiezu.com [HTTP_ACCEPT] => */* [HTTP_REFERER] => http://baidu.com [PATH] => /sbin:/usr/sbin:/bin:/usr/bin ... [REQUEST_METHOD] => GET ... [PHP_SELF] => /test.php [REQUEST_TIME] => 1480651125 )
二、伪装来路(referer):
什么是来路?从A页面点击进入B页面,那B页面的来路就是A页面的URL。伪装来路十分简单,有两种方法:1、使用上面的“--referer”参数或“-e参数”;2、直接使用“-H”参数设置http头,下面分别介绍两种方法。
1、“-e/--referer”参数方式:
# 告诉http服务器,我是从qq.com来的
[[email protected] ~]# curl -e http://qq.com http://db.ci/test.php 2>/dev/null|grep HTTP_REFERER [HTTP_REFERER] => http://qq.com # 告诉http服务器,我是从baidu.com搜"aiezu"关键词点进来的 [[email protected] ~]# curl --referer https://www.baidu.com/s?wd=dbci http://db.ci/test.php 2>/dev/null|grep HTTP_REFERER [HTTP_REFERER] => https://www.baidu.com/s?wd=dbci
2、“-H”参数的方式:
# 告诉http服务器,我是从微博过来的
[root@dbci ~]# curl -H "Referer: http://weibo.com" http://db.ci/test.php 2>/dev/null|grep HTTP_REFERER [HTTP_REFERER] => http://weibo.com
三、伪装浏览器类型(User-Agent):
首先,我们先找到浏览器对应的“User-Agent”字符串。可以直接在Chrome中的“开发者工具”的“网络”标签查看http请求头获得;也可以在网上搜索获得,如通过百度搜索“微信useragent”、“ie useragent”、“chrome useragent”等。
获得对应浏览器的“User-Agent”字符串后,同样可以通过两种方式告诉http服务器我用的浏览器类型:
1、“-A/--user-agent”参数方式:
# 告诉http服务器,我是通过微信内置浏览器访问
[root@dbci ~]# UA='Mozilla/5.0 (iPhone; CPU iPhone OS 8_0 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Mobile/12A365 MicroMessenger/6.0 NetType/WIFI'; [[email protected] ~]# curl -A "$UA" http://db.ci/test.php|grep HTTP_USER_AGENT [HTTP_USER_AGENT] => Mozilla/5.0 (iPhone; CPU iPhone OS 8_0 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Mobile/12A365 MicroMessenger/6.0 NetType/WIFI # 告诉http服务器,我是通过Chrome浏览器访问 [[email protected] ~]# UA='Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1667.0 Safari/537.36'; [[email protected] ~]# curl --user-agent "$UA" http://db.ci/test.php|grep HTTP_USER_AGENT [HTTP_USER_AGENT] => Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1667.0 Safari/537.36
2、“-H”参数方式:
# 告诉网站,我是百度蜘蛛爬取
[[email protected] ~]# UA="Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)"; [[email protected] ~]# curl -H "User-Agent: $UA" http://db.ci/a.php|grep HTTP_USER_AGENT [HTTP_USER_AGENT] => Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)