HTTP的理解

=== 

要求~

要清晰的理解HTTP基础理论

收发包原理

返回码特征

GET/POST优劣

编码问题

实践

网卡抓包、进程抓包

Python写一个小型爆破。例如www.a.com跑根目录下文件,可简单加载外部字典。

 ===


 理论基础:

http 超文本传输协议  

客户端与服务器的交互:客户端发起请求,建立一个到服务器指定端口(80)的TCP连接,服务器收到请求,发回一个状态后,如HTTP/1.1 200 OK,和响应消息。

http 基本认证,客户端把用户名密码经过base64 加密后,放在Authorization header 中发送给服务器,而且http协议是无状态的,同一客户端对服务器的每个请求都要认证。但是缓存就不用了


收发包原理:

感觉就是客户端发送请求,服务端收到请求发送响应。


HTTP/1.1中定义了5类状态码, 状态码由三位数字组成,第一个数字定义了响应的类别

1XX  提示信息 表示请求已被成功接收,继续处理

2XX  成功 表示请求已被成功接收,理解,接受

3XX  重定向 要完成请求必须进行更进一步的处理

4XX  客户端错误 -  请求有语法错误或请求无法实现

5XX  服务器端错误 -   服务器未能实现合法的请求

常见的:

200 OK 服务器成功处理了请求

301/302 Moved Permanently(重定向)请求的URL已移走

304 Not Modified(未修改)客户的缓存资源是最新的, 要客户端使用缓存

404 Not Found 未找到资源

501 Internal Server Error服务器遇到一个错误,使其无法对请求提供服务


Get post

Get

Post

 

从服务器上获取数据

向服务器传送数据

数据是在提交表单ACTION属性所指的URL中,在URL中可以看到

数据内容放在HTML header内一起传送到ACTION属性所指的URL地址

服务器端用Request.QueryString获取变量的值

服务器端用Request.Form获取提交的数据

传送的数据量小,不能大于2KB

默认不受限制

安全性低,数据被放在请求的URL

较高<数据并没有加密>

 



URL的编码和解码

URL的格式为http://hostname:port/p1/p2/resource

其中://为固定编码, 用来分隔路径, : 用来指定端口,p1,p2是路径名。

URL是采用ASCII字符集进行编码的,若含有非ASCII字符集中的字符,就要对其进行编码。

还有,URL中含有好多字符是保留字,它们在URL中具有特殊含义,若要在URL中使用保留字,就要进行编码。

 

浏览器请求服务器的时候会先将中文进行UTF-8编码,然后再发送到服务器端。


 

http协议报文分请求报文和响应报文,这两种报文的编码格式一样的,这里以请求报文为例:

请求报文分三个部分,分别是:

1) start line

2) headers

3) body

start line 和 headers 必须是ASCII编码,body中的内容可以是任何编码,这由headers中的Content-Type 来说明

 

对于start line ,这里要注意的是URL编码。

对于headers,

对于body,字符采用什么编码,图像采用什么格式,,都是headers 中的Content-Type 来说明。Content-Enconding 是记录文档压缩方法的:gzip,compress,deflate,indentity    ; http压缩是http内容编码的一种

 

分块编码Chunked

不能预先确定报文的长度时,就需要用Transfer-Encoding 域来确定报文长度。

Transfer-Encoding 的值一般为chunked ,表明采用chunked编码来进行报文的传输。Chunked编码的基本方法是将大块数据分解成多块小数据,每块可自己指定长度


实践:

网卡抓包,如wireshark,

进程抓包,我用的是winsock,指定特定进程,

用wireshark的filter过滤也可以,但是winsock显示的内容更直白。


小型爆破:

import sys,httplib
import urllib
import re

urla="http://www.nynu.edu.cn/"
f = open("db.txt")
s = f.read()
dirs = re.split(' ',s)
urlb=".asp"
for line in dirs:
urlstr = urla + str(line) + urlb
#print urlstr
adr=urllib.urlopen(urlstr)
if adr.getcode()==200:
print " "+str(urlstr) + " 存在"
else: 
print " "+str(urlstr) + " 不存在"



这个是加载简单字典, 我的就是db.txtx :   admin login  admin_index admin_login admin/admin admin/index admin/login  每一个中间是一个空格

urllib是HTTP客户端库,re模块提供正则表达式支持,我是看了这位大大的资料才了解的~   http://www.cnblogs.com/yuxc/archive/2011/08/01/2123995.html


恩恩  在网上还发现了一些大大的资料在默写方面更详细,贴出来大家一起学习吧

http://www.iwms.net/n2030c40.aspx

http://www.cnblogs.com/naledao/p/3669177.html

http://blog.youkuaiyun.com/lyq5655779/article/details/7515284



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值