`

模拟浏览器与web服务器之间的通信

 
阅读更多

最近因为某些需要,在学习如何通过编程来和Web服务器交互。
现在似乎有点入门了,和大家分享一下心得。
(估计这也是做农场外挂等的基础,如果你有兴趣,欢迎和我讨论)

1.前期准备

必备知识/工具:
  1.http协议基础
  2.网络抓包工具

要与web服务器进行交互,基本的http协议知识是必须的。
这里我用自己的理解来简单说下吧:
初学时,需要知道http协议最重要的几个特点,否者就无法正确编写程序。

1.http协议是请求/应答模式的
就是,首先你先发一个请求给web服务器,然后web服务器会给你一个回应。
与web服务器的交互过程,就是这“一问一答”的过程。
常用请求有2种,一种是Get(用于请求获取资源)。一种是Post(用于请求提交表单等数据)

2.http协议是不维持连接的。
这个是什么意思呢?和我们上次做的foxmail的smtp协议不同,
http协议在每一次的“问答”过程结束后,服务器都会关闭连接。
就是说,你soket创建一个套接字去连接服务器,并且发送了一个请求(问),
服务器返回一个请求的结果(答)后,服务器就会关闭这个套接字。
如果要在发送第二个请求怎么办?——再创建一个套接字,再去连接服务器。

3.http协议不会记录访问者的状态
如2所说,http协议不维持连接。每一次问答结束后,连接的套接字就没用了。
那么,像论坛这样的网站是如何记住我们已经登录了呢?答案是:cookies.
在提交登录表单后,如果登录成功,服务器会返回一个或几个cookie。
在下一次的请求中,再次把这些cookie发送给服务器,来证明自己已经登录了网站。

以上3点,是我这几天学习的总结,如有错,还请高手指点。
有了http的基础知识后,我们还需要一款网络抓包工具,
去了解浏览器在与web服务器交互的过程中都发送/接收到了什么。
我们自己编写的程序,其实也就是把浏览器发给服务器的东西自己再发送一次
浏览器发送了什么,我们就发送什么,从而达到模拟浏览器与服务器交互的过程。

抓包工具有很多:Ethereal , sniffer 都可以。
这里我们只关心http的数据,所以选用:HttpWatch.
关于HttpWatch的详细使用,你们自己百度下吧。。。这里我就不罗嗦了

2.我编写的HttpTester工具

这个“工具”很简单,是用来发送一些测试的http请求数据的,并且接收服务器的回应数据。
如果想做个论坛自动灌水机,或者是什么XX网页游戏的助手的话。可以先用HttpTester来测试一下。
HttpTester界面如下:

未标题-1.jpg

下载 (40.62 KB)
2010-9-17 15:30



我的HttpTester可执行文件下载:
HttpTester.rar (135.99 KB)



HttpTester源代码:
IDE:VS2005
语言:C++

本帖隐藏的内容需要回复才可以浏览



接收数据的延迟,是发送请求后,等待多久才去接收服务器的回应。
为什么要等待呢?如果不等待,请求发送过去后(用send函数),
马上去接收数据(调用recv函数),用非阻塞的套接字会收不到任何数据(原因是明显的)。
就算用了阻塞的套接字,也可能会只收到了“半截”数据。因为服务器如果发送大量的回应数据
网络延迟的存在,我们主机可能会先收到一部分数据,而其他部分的数据在延迟了几秒后才到达。
阻塞套接字的recv接收,在收到一部分数据后,就返回了。

用非阻塞的套接字是什么情况呢?
可以先调用select函数来延迟几秒,测试是否有数据达到。有数据达到了,再调用recv去接收。
注意:select函数的行为是:一旦在指定的延迟时间内,发现能读取数据后,它就返回。
就是说,当只有半截数据过来时,select也返回了,这时调用recv还是只接收到了半截数据。

用简单的方法,阻塞和非阻塞套接字都不能很好地完全接收数据。
我的做法是:先用Sleep函数延迟几秒,然后select函数判断一下,是否有能读取的数据。
如果有,就调用recv去接收。由于事先调用了select判断,
我觉得这里用阻塞的,非阻塞的套接字都无关紧要。

我的这个做法,还有缺陷,就是延迟时间不够的话,还是不能完全接收服务器的回应数据。
回想http协议的特点,服务器会在回应完毕后,关闭套接字。
我们可以尝试做一个recv接收数据循环。循环终止的条件是:套接字已被服务器closesocket掉了。
这个尝试,就交给你们来完成了,谁有做这个测试的,得出结果后,请通知我。。。
我的简单处理方法,已能应付大多数情况。嘿嘿。



3.HttpWatch+HttpTester与服务器交互。

3.1取得CSDN注册会员页面的验证码图片

我先举这个例子来说明,其他的应该可以触类旁通了。

CSDN注册会员的页面地址是:http://passport.csdn.net/UserLogin.aspx?from=%2fPassport.aspx

我们要取得这个页面上的这张验证码图片:

02.jpg



1.打开HttpWatch来分析浏览器在取这张验证码时发送了怎样的请求。

03.jpg

下载 (107.74 KB)
2010-9-17 16:11



我们可以看到浏览器在请求这张图片时,发送了如下数据:

GET /ShowExPwd.aspx?temp=ge6nmewq HTTP/1.1
Accept: */*
Referer: http://passport.csdn.net/UserLogin.aspx?from=%2fPassport.aspx
Accept-Language: zh-cn
UA-CPU: x86
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022)
Host: passport.csdn.net
Connection: Keep-Alive
Cookie: ASP.NET_SessionId=na0bcr0ukuehaamjvzbskgta; ClientKey=ab5eb6b5-94b**5a5-99fb-1662df04030a

2.打开HttpTest,把这串数据原封不动地复制到“请求的数据”编辑框中。
如下图:
注意:填写“请求的数据”,末尾必须要有2个空行。否则收不到任何回应。

04.jpg

下载 (60.83 KB)
2010-9-17 16:16



“服务器地址”编辑框填写web服务器的IP或者域名,这里是:passport.csdn.net
“服务器端口”编辑框填写web主机的端口,http协议默认端口是80,这里我们填写默认的端口号:80
“接收数据的延迟”编辑框,设置为:1000(一秒)

然后,就可以点“发送”按钮了。
服务器回应结果如下图:

05.jpg

下载 (78.83 KB)
2010-9-17 16:25



输入一个文件名,然后点“保存数据”按钮,就会把服务器返回的图片数据保存为文件。
然后点“打开文件”,就可以浏览到收到的验证码图片了。

3.2获取咱如鹏网首页的logo图片。

通过HttpWatch的分析,我们知道浏览器在获取咱如鹏网logo时
是发送了类似如下的请求:

GET /forum/templates/uchome/images/logo.gif HTTP/1.1
Accept: */*
Referer: http://www.rupeng.com/forum/
Accept-Language: zh-cn
UA-CPU: x86
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022)
Host: www.rupeng.com
Connection: Keep-Alive
Cookie: cdb_sid=Nm5oej

对http协议有初步了解后,我们知道,如果只是想“单纯地”获取如鹏网logo
只需要发送如下的请求就够了:
(注意:发送的请求最后需要有2个空行)

GET /forum/templates/uchome/images/logo.gif HTTP/1.1
Host: www.rupeng.com


下图显示获取如鹏网ogo的情况。

06.jpg

下载 (68.96 KB)
2010-9-17 16:36




3.3 获取如鹏网首页数据

还是老样子,先用HttpWatch来分析。
发现浏览器在获取如鹏首页发送了如下请求:

GET /forum/ HTTP/1.1
Accept: */*
Accept-Language: zh-cn
UA-CPU: x86
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022)
Host: www.rupeng.com
Connection: Keep-Alive

我做的HttpTester有点烂,没有gzip压缩/解压缩功能。(嘿嘿,其实是我自己现在写不出算法)
所以,要用我的HttpTester获取如鹏首页数据,需要改一改上面的请求。
修改后的请求如下:

GET /forum/ HTTP/1.1
Accept-Encoding: utf-8
Host: www.rupeng.com

这里主要改了Accept-Encoding头从原先的gzip改成utf-8,说明我们只能接收utf-8编码的内容。

下图显示获取如鹏网首页数据的情况:

07.jpg

下载 (83.1 KB)
2010-9-17 16:51




4.模拟浏览器登录网站

我的这个帖子《查看咱网站用户信息》是一个例子
http://www.rupeng.com/forum/thread-15682-1-1.html

用HttpTester可以一步步讲解步骤的。但是这里篇幅原因就不说了
主要是提取cookie和填写cookie。提交请求,获取页面信息这样。


5.Chunked解码

在“3.3 获取如鹏网首页数据”这一步中,获取首页后,
查看服务器返回的消息报头,有这么一段:Transfer-Encoding: chunked
这个报头字段说明返回的附加数据(这里是页面数据)是经过chunked编码的。

如果要保存返回的附加数据的话,需要chunked解码。
( 勾选“chunked解码”复选框再保存数据。
Chunked解码比较简单,我自己写了一个简单的解码函数在HttpTester里面,
这个解码过程可能会有些问题,但目前还够用,呵呵 )

其实,如鹏网首页数据不用Chunked解码来查看也是可以的。
我遇过一个网站,获取一张验证码图片后,原本1.5K的图片数据,
它给Chunked编码到了4K发过来。-。-
这里不Chunked解码就无法查看图片的内容了。。。


分享到:
评论

相关推荐

    (牛客网C++课程)Linux 高并发Web服务器项目实战(带定时检测代码)

    (牛客网C++课程)Linux 高并发Web服务器项目实战(带定时检测代码) 技术框架: 1. 线程池 + 非阻塞 socket + epoll + 事件处理的并发模型 2. 状态机解析HTTP请求 3. 心跳机制 4. 简易日志系统 主要内容: 1. ...

    webSocket 模拟 - Node.js 服务器

    SockJS 为您提供了一个连贯的、跨浏览器的 Javascript API,它可以在浏览器和 Web 服务器之间创建一个低延迟、全双工、跨域的通信通道,无论是否有 WebSocket。这需要使用 Node.js 服务器(这是 Node.js 的一个版本...

    智能家居架构包括服务器端web网页android 手机客户端各种测试脚本基本上基础架构都已经实现

    服务器端是整个系统的核心,它负责与各个设备进行通信和数据交换。Web网页是用户通过浏览器进行控制和管理的界面,它提供了丰富的功能和操作选项。Android手机客户端是专门为手机用户设计的应用程序,它可以方便地...

    SockJS-client:WebSocket 模拟和 Javascript 客户端-开源

    SockJS 为您提供了一个连贯的、跨浏览器的 Javascript API,它在浏览器和 Web 服务器之间创建了一个低延迟、全双工、跨域的通信通道。 在底层,SockJS 尝试首先使用原生 WebSockets。 如果失败,它可以使用各种特定...

    python爬虫入门教程–快速理解HTTP协议(一)

    你浏览的每一个网页都是基于 HTTP 协议呈现的,HTTP 协议是互联网应用中,客户端(浏览器)与服务器之间进行数据通信的一种协议。协议中规定了客户端应该按照什么格式给服务器发送请求,同时也约定了服务端返回的...

    工程硕士学位论文 基于Android+HTML5的移动Web项目高效开发探究

    综上所述,“认我测”在线认证检测系统,率先填补了认证检测领域移动端的空缺,提供了Web浏览器+移动端的双端访问模式,给用户提供了多种访问途径,真正实现了用户和检测机构的随时随地在线下单检测。 关键词:...

    tobaccoclient.rar

    socket就是个浏览器和后台web服务器之间的长连接,用于双向通信的 服务器就是一个socketServer,你们的那些远端设备就是socketClient(设备机器,测试的时候用的是模拟的socketClient.java类)

    Web安全深度剖析(张柄帅)

    《Web安全深度剖析》总结了当前流行的高危漏洞的形成原因、攻击手段及解决方案,并通过大量的示例代码复现漏洞原型,制作模拟环境,更好地帮助读者深入了解Web应用程序中存在的漏洞,防患于未然。 《Web安全深度剖析...

    电视台竞赛抢答器系统-完整源代码

    同时服务器端模拟了WEB服务器,通过HTTP方式向客户端提供抢答试题。客户端使用浏览器方式显示抢答试题。抢答试题为HTML页面,可嵌入视频、flash动画等元素作为抢答试题显示。 这套系统工作稳定,准确率高,可控性能...

    ESP8266:使用谷歌地图的GPS定位Web服务器-电路方案

    在本教程中,我将向您展示如何使用Google Map 制作GPS Web服务器,以显示带有ESP8266 和串行GPS 的GPS模块的位置。您可以通过Web浏览器从多个设备连接到现有Wi-Fi网络,并始终查看模块的位置。 请注意,由于我们将...

    [完整][中文][WEB安全测试].(美)霍普.扫描版.pdf

     本书中的秘诀所覆盖的基础知识包括了从观察客户端和服务器之间的消息到使用脚本完成登录并执行Web应用功能的多阶段测试。在本书的最后,你将能够建立精确定位到Ajax函数的测试,以及适用于常见怀疑对象(跨站式脚本...

    http模拟工具

    HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议。。 HTTP是一个基于TCP/IP通信协议来传递数据(HTML 文件, 图片...

    【满分答案】川大《计算机网络与通信》18春在线作业2答案.doc

    A、降低成本 B、打印文件 C、资源共享 D、文件调用 正确答案:C 满分:2 6 因特网利用浏览器,查看某Web主页时,在地址栏中也可填入( )格式的地址。 A、210.37.40.54 B、198.4.135 C、128.AA.5 D、210.37.AA.3 正确...

    电力市场综合模拟系统——实验方法与系统架构研究

    系统采用客户端程序/Web浏览器、应用服务器、数据服务器的3层B/S与C/S混合模式,具备健壮的数据通信与仿真交互架构。设计管理员、教练员和学员3类用户,实验过程严格统一控制,各类用户界面清晰明确。实验参数设置清晰...

    watergun:在物理水枪中创建独立的浏览器游戏,充当wifi热点,服务器和控制器

    通过websocket与浏览器通信 创建一个有趣的游戏 Graphix 声音 组件 水枪 ESP8266(网络服务器,SD卡读卡器,..) Teensy 3.1(处理单元) GY-80(运动检测) 单击按钮(用于触发) 锂电 历史 15年8月13日:...

    2.ASP.NET.2.0.高级编程(第4版) [1/7]

    第6章 ASP.NET 2.0的Web服务器控件 163 6.1 BulletedList服务器控件 163 6.2 HiddenField服务器控件 168 6.3 FileUpload服务器控件 170 6.3.1 使用FileUpload控件上传文件 170 6.3.2 指定正确的ASP.NET权限给...

    MvcSignalR-master

    它包括了一个Asp .Net服务器端库和一个Js端库,集成了数种常见的消息传输方式,如long polling,WebSocket,并提供相应的Api供开发人员选择如何调用,帮助其可以简单快速地实现客户端与服务器端相互间的实时通信。...

    ASP.NET2.0高级编程(第4版)1/6

    3.1.1 内置的Web服务器39 3.1.2 IIS40 3.1.3 FTP41 3.1.4 Web站点需要  FrontPage Extensions42 3.2 ASP.NET页面结构选项43 3.2.1 内置编码44 3.2.2 新的后台编码模型46 3.3 ASP.NET 2.0的Page指令48 3.3.1 @Page...

    java源码包3

     Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 ...

    smocker:一个小型库,用于简化基于 ajax 的应用程序的原型设计或测试

    sMocker 使直接在我们的浏览器中模拟 Web 服务器变得更加容易和简单。乍看上去假设我们有典型的 Todos MVC 单页 web 应用程序,我们通过GET /todos ajax 请求将待办事项列表加载到服务器。 开始使用 sMocker 的最...

Global site tag (gtag.js) - Google Analytics