0、看这本书《HTTP权威指南》,写的非常好。
1、get
get /add?a=1&b=2 HTTP/1.1\r\n
Host: cgsl:8161\r\n
User-Agent: curl7.47.1\r\n
\r\n
2、post支持两种内容格式
Content-Type: application/x-www-form-urlencoded
\r\n
username=admin&password=1234
第二种格式,用于文件上传
Content-Type: multipart/form-data; boundary=---------------------------7d33a816d302b6
\r\n
-----------------------------7d33a816d302b6
Content-Disposition:form-data;
name="userfile1";
filename="E:\s"Content-Type:
application/octet-stream abbXXXccc
-----------------------------7d33a816d302b6
Content-Disposition: form-data;
name="text1" foo
-----------------------------7d33a816d302b6
Content-Disposition: form-data;
name="password1" bar
-----------------------------7d33a816d302b6--
3、host字段在http1.0中可以没有,在http1.1中必须有。服务端一般不做校验,随便填写一个字符串都可以。如果服务端进行了虚拟服务器的设置,则必须写对。
4、http的基本认证--见http权威指南
4.1 基于用户名+密码的方式,用户名和密码拼接起来,base64编码后发送。如果是https加密通道,就没有问题。如果是http通道,用户名密码会泄露。
4.2 基于摘要的方式。发送的内容是密码的摘要信息,密码不会泄露,但要预防回放攻击,彩虹表攻击。
4.3 前面两种的原理,都是服务端发现请求中没有认证信息,则返回要求认证。浏览器弹出对话框让用户输入用户名密码。
4.4 常见网站,都是应用层进行认证,即http头中没有正确的token,服务端总是返回登陆界面。
5、http消息头是字符串,但body可以是二进制,因为在头部中已经写了body的长度。
6、tcpdump -w data.dmp -s 0 host server_ip and port 3333
-s 指定每个包的长度,0表示不截断。有的系统中,默认值不是0,导致抓到的报文不完整。