ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 61788|回复: 76

[分享] 【感谢加精】网页采集教程第五课-如何伪造Cookie及处理Referer防盗链

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2012-7-28 15:20 | 显示全部楼层 |阅读模式
本帖最后由 liucqa 于 2012-11-5 00:01 编辑

俺的网页采集教程承蒙周总版大驾光临给了2个技术分,随后又被小月加精,在此一并表示感谢

第一课:http://club.excelhome.net/thread-893760-1-1.html
第二课:http://club.excelhome.net/thread-894527-1-1.html
第三课:http://club.excelhome.net/thread-896608-1-1.html
第四课:http://club.excelhome.net/thread-897117-1-1.html
第五课:http://club.excelhome.net/thread-899268-1-1.html

高级篇:
第一课:http://club.excelhome.net/thread-902266-1-1.html
第二课:http://club.excelhome.net/thread-939881-1-1.html



************************俺是上课的分割线********************************   

前言:俺之所以把伪造Cookie和处理Referer写到一堂课里面,是因为当初搞这个Cookie的目的就是为了避免提交请求被网站拒绝,而伪造Referer的目的也是为了避免被网站拒绝,所以既然处理这两个参数的目的相同,俺就当做一堂课来讲。

目前访问网站,经常遇到的防盗链措施有以下几种:
1、Cookie验证,最常见是是例如SESSIONID=之类的
2、Referfer验证,一般当域名正确或者为空的时候,网站就不会认为是盗链了。
3、时间戳验证、密钥函数验证或隐藏参数验证,这个在ASP或者JSP的服务器上相当常见了。

本教程的第二课讲解的Viewstate参数,实际上就可以理解成第三种防盗链措施。

所谓的”伪造cookie“,就是从网站获取一个有效的cookie,在提交请求的时候附上这个Cookie而已。


在讲解防盗链之前,请先学习一下Http Head的知识

HTTP(HyperTextTransferProtocol)即超文本传输协议,目前网页传输的的通用协议。HTTP协议采用了请求/响应模型,浏览器或其他客户端发出请求,服务器给与响应。就整个网络资源传输而言,包括message-header和message-body两部分。首先传递message- header,即http header消息。http header 消息通常被分为4个部分:general  header, request header, response header, entity header。但是这种分法就理解而言,感觉界限不太明确。根据维基百科对http header内容的组织形式,大体分为Request(请求头)和Response(响应头)两部分。

HTTP头由一系列行组成,每行都包含名称,然后依次是冒号、空格、值。字段可按任何顺序排列。
某些头字段既能用于请求头也能用于响应头,而另一些头字段只能用于其中之一。

下面是一些常见的头:
User-Agent:    浏览器可接受的MIME类型。
Accept-Charset:浏览器可接受的字符集。
Accept-Encoding:浏览器能够进行解码的数据编码方式,比如gzip。
Accept-Language:浏览器所希望的语言种类,当服务器能够提供一种以上的语言版本时要用到。
Authorization:授权信息,通常出现在对服务器发送的WWW-Authenticate头的应答中。
Connection:表示是否需要持久连接。如果这里的值为“Keep-Alive”,或者看到请求使用的是HTTP 1.1(HTTP 1.1默认进行持久连接),就表示持续连接。
Content-Length:表示请求消息正文的长度。
Cookie:设置cookie,这是最重要的请求头信息之一
Host:初始URL中的主机和端口。
Pragma:指定“no-cache”值表示服务器必须返回一个刷新后的文档,即使它是代理服务器而且已经有了页面的本地拷贝。
Referer:包含一个URL,用户从该URL代表的页面出发访问当前请求的页面。
User-Agent:浏览器类型,如果Servlet返回的内容与浏览器类型有关则该值非常有用。

我们处理防盗链问题的本质,就是对Http头信息的处理。

评分

12

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-7-28 15:21 | 显示全部楼层
本帖最后由 liucqa 于 2014-5-27 22:27 编辑

请看下面的代码,原贴在这里:http://club.excelhome.net/forum. ... =811229&pid=5541000
承蒙xmyjk大神许可,俺直接用他的例子讲解,顺便在此表示感谢。

Sub Test()
    Dim tmp() As String, P As Long, arr() As String, xmlhttp As Object, I As Long, t As Single, COOKIE As String

    Set xmlhttp = CreateObject("WinHttp.WinHttpRequest.5.1")
    With xmlhttp
        .Option(6) = 0
        .Open "GET", "http://211.167.229.177/cicpa/public/publicindex.jsp", False
        .SEND
       COOKIE = Split(.getResponseHeader("Set-Cookie"), ";")(0)                  '第一次调用获取Cookie
    End With
    With xmlhttp
        .Open "POST", "http://211.167.229.177/cicpa/QueryOfficeAction.do", False
        .Option(6) = 1
        .setRequestHeader "Referer", "http://211.167.229.177/cicpa/public/stockOffice.jsp"         
'设置正确的Referer
        .setRequestHeader "Cookie", COOKIE                                                                            '设置有效Cookie
        .setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
        .setRequestHeader "Connection", "keep-alive"
        .SEND "method=queryOffices&isStock=&pageNum=1&ascGuid=00000000000000000000000000000000&offName=&offCode=&cpaNum=1"          '第二次获取数据
        With CreateObject("new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")                   'DataObject对象,数据放入剪贴板,记事本观察数据
            .SetText xmlhttp.responsetext
            .PutInClipboard
        End With
    End With
    Set xmlhttp = Nothing
End Sub


通常来说,如果要解决某些Cookie的防盗链问题,必须要在提交数据之前先获取一个有效的Cookie,因此采用两次WinHTTP调用是最常见的方式。
第一次调用winhttp获得有效Cookie,第二次调用利用前面获得的有效Cookie+自己生成的部分Cookie,以及Referer,构成提交参数,即可通过网站识别。
对某些简单网站来说,如果前后两个URL的Cookie没有什么变化的话,不需要人为构造Cookie。

如何知道网站是否需要伪造Cookie和Referer才能获取数据呢?这个简单,你只要去掉cookie和Referer试一下就行了。
如何知道我获取的Cookie和Referer是有效的呢?这个需要用抓包工具看一下
捕获.JPG

实际上,在上例中,我们可以将蓝色语句去掉,依然也能获得正确的数据。为什么呢?
这是因为此网站比较简单,在两次调用之间,网站并没有发送其他Cookie到客户端,因此第一次获取的有效Cookie一直保留在Winhttp内部,发送提交请求的时候,默认就一并提交了。

所以,这个简单的例子算不上是伪造Cookie,只能算是获取有效Cookie罢了。

此例中的Referer也可以换成  "http://211.167.229.177/cicpa/",同样能得到正确的结果。







TA的精华主题

TA的得分主题

 楼主| 发表于 2012-7-28 15:21 | 显示全部楼层
本帖最后由 liucqa 于 2012-8-27 10:00 编辑

在二楼的例子中,使用getResponseHeader方法来获取Cookie,但这个方法只能返问单个的header标签,如果在Http头里面有多个cookie标签,该方法就无效了

我们来看88娱乐城网站抓包(网址www.game88city.net)
捕获.JPG
在抓包中可以发现,该网站的cookie有三个。很明显不能使用getResponseHeader方法了,那么改用什么方法呢?

在XMLHTTP中还有一个getAllResponseHeaders方法,可以返回全部的Head信息,我们可以利用这个方法来得到全部的cookie信息。


语句为Cookie = .getallResponseHeaders(),将得到的cookie字符串拷贝到记事本查看
捕获.JPG
你会发现得到了三个Cookie信息,然后用split取出来即可。

全部代码如下:
Sub Test()
    Dim CookieHeaders, Cookie, winhttp As Object, i&
    Set winhttp = CreateObject("WinHttp.WinHttpRequest.5.1")

    With winhttp
        .Option(6) = 0
        .Open "GET", "http://www.game88city.net/appg/betting-view-matches.php", False
        .setRequestHeader "Connection", "Keep-Alive"
        .send
        Cookie = .getallResponseHeaders()
        With CreateObject("new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")                   'DataObject对象,数据放入剪贴板,记事本观察数据
            .SetText Cookie
            .PutInClipboard
        End With
        CookieHeaders = Filter(Split(.getallResponseHeaders(), Chr(10)), "Set-Cookie")    '获取Cookie
    End With
    For i = 0 To UBound(CookieHeaders)
           CookieHeaders(i) = Split(Split(CookieHeaders(i), ": ")(1), ";")(0)
    Next
    Cookie = CookieHeaders(1) & "; " & CookieHeaders(2) & "; " & "cookie_user_language=simplified"   'CookieHeaders(0)
    Set winhttp = Nothing
    MsgBox Cookie
End Sub


最后的Cookie的形式为:PHPSESSID=ccf01f03dc9b4dc21af3dcc1d3d5a849; NSC_10.66.1.117=440b37343660; cookie_user_language=simplified

得到这个cookie之后,就可以进行数据的获取操作了。

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-7-28 15:22 | 显示全部楼层
本帖最后由 liucqa 于 2012-7-28 17:26 编辑

Cookie的作用在网页获取中,并不仅仅是为了起到防盗链的作用,同时也是用户身份的标记。

下面举一个明升网站通过Cookie获取不同语言版本的数据的例子(网址为http://mkt4.88ms88.com)

代码如下
Sub test()
    Dim CookieHeaders, Cookie, winhttp As Object, i&
    Set winhttp = CreateObject("WinHttp.WinHttpRequest.5.1")

    With winhttp
        .Option(6) = 0
        .Open "GET", "http://mkt4.88ms88.com/mansion88.aspx?lang=en", False              '执行这句,得到的网页数据是英文
        '.Open "GET", "http://mkt4.88ms88.com/mansion88.aspx?lang=cs", False              '执行这句,得到的网页数据是简体中文
        .setRequestHeader "Connection", "Keep-Alive"
        .send
        Cookie = Split(.getResponseHeader("Set-Cookie"), ";")(0)     '获取Cookie            '第一次获取Cookie,决定了语言
        
        .Option(6) = 1
        .Open "GET", "http://mkt4.88ms88.com/UnderOver.aspx?Market=t", False          '第二次取得数据
        .setRequestHeader "Cookie", Cookie
        .setRequestHeader "Connection", "Keep-Alive"
        .send

        With CreateObject("new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")       '调试用,数据放入剪贴板
            .SetText winhttp.responseText
            .PutInClipboard
        End With
    End With
End Sub




TA的精华主题

TA的得分主题

 楼主| 发表于 2012-7-28 15:23 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 liucqa 于 2013-4-11 00:27 编辑

第五课小结:

    本课以三个实例,讲解了获取网页Cookie的方法
    获取Cookie只是网页采集的第一步,你打开了网页的大门,能从里面得到什么数据,还要看个人的VBA基本功了。


***********************我是结束的分割线*******************************
   
    本教程到此就基本就结束了。我在教程里面只是从初学者的角度讲解了一些网页采集必备的基础知识,只是为了使初学者少走弯路而已。即使你学会了本讲座的全部代码,但是在实际应用的时候,依然有可能不能得到你需要的数据。如果发生这种情况,请务必淡定,回到第一课细心研究抓包软件的使用好了。
    网页抓取的三大利器:Httpfox、Fiddler2、HttpAnalyzer可以帮助你无往而不利。当然,前提是你得会使用它们,嘿嘿。

关于Session cookie的一篇文章
http://justsee.iteye.com/blog/831730

***********************我是唠叨的分割线*******************************

    最后说几点:
    1、本教程版权归个人所有,欢迎转载,但请注明作者以及ExcelHome网站的原帖地址。
    2、本教程不是代码大全,俺也不是免费代码工具,请会员在具备自学能力之后再来钻研。
    3、如果哪位大神能够帮助我完善这个教程,那真是全体会员的福音了。


最后附几个本教程没有涉及到的知识链接,是xmyjk的作品
http://club.excelhome.net/forum.php?mod=redirect&goto=findpost&ptid=854369&pid=5934736
http://club.excelhome.net/forum.php?mod=redirect&goto=findpost&ptid=823704&pid=5644776

如果有希望继续学习的会员,请接下来看高级篇
   


补充内容 (2013-8-10 21:40):
http://tools.jb51.net/tools/js_geshihua.asp  JS脚本格式化网站

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2012-7-28 16:59 | 显示全部楼层
是否还需要找个需要伪造COOKIE的网址作为试验一下啊。
呵呵

TA的精华主题

TA的得分主题

发表于 2012-7-29 21:58 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
做个记号 好好学习

TA的精华主题

TA的得分主题

发表于 2012-7-30 16:15 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 kangatang 于 2012-7-30 16:17 编辑

= .getallResponseHeaders()
= .getResponseHeader("Set-Cookie")
学习。
最好顺便讲一下SESSION

TA的精华主题

TA的得分主题

发表于 2012-7-30 16:26 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
AVEL 发表于 2012-7-28 16:59
是否还需要找个需要伪造COOKIE的网址作为试验一下啊。
呵呵

哎,为了找个实例,而且要有挑战性。找了这样一个例子(别唾我)

如何提取这张图片到硬盘
http://www.ltz.cc/templates/fervor/images/logo.gif

TA的精华主题

TA的得分主题

发表于 2012-7-30 16:27 | 显示全部楼层
AVEL 发表于 2012-7-28 16:59
是否还需要找个需要伪造COOKIE的网址作为试验一下啊。
呵呵

哎,为了找个实例,而且要有挑战性。找了这样一个例子(别唾我)

如何提取这张图片到硬盘
http://www.ltz.cc/templates/fervor/images/logo.gif
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-21 21:55 , Processed in 0.037741 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表