HTTP协议描述
GET https://www.sogou.com/ HTTP/1.1
Host: www.sogou.com
Connection: keep-alive
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,/;q=0.8 Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.221 Safari/537.36 SE 2.X MetaSr 1.0
Referer: https://123.sogou.com/
Accept-Encoding: gzip, deflate, sdch
Accept-Language: zh-CN,zh;q=0.8
Cookie: IPLOC=CN3301; SUID=EAE881B73320910A000000005A961B73; SUV=1519801225402046; m=C1A78AA9E719BD5FECFB5C43F8C7CB94; YYID=C1A78AA9E719BD5FECFB5C43F8C7CB94; pgv_pvi=2720575488; ABTEST=0|1523416483|v17; SNUID=ECEE84B105036CB1F6C4DB9D06FAD736; ld=kyllllllll2zugtUlllllVrA8f7lllllHc4ofkllll9lllllpZlll5@@@@@@@@@@; browerV=8; osV=1; LSTMV=367%2C321; LCLKINT=2481; usid=2dL4gDAmIPBy6mk7
上述就是一个完整正常的http请求行 请求头 请求体
GET / HTTP/1.1 分别是 请求方法 请求URL 版本协议
HTTP/1.1 200 OK --- 状态行 分别是 协议版本 状态码 状态描述
Server: nginx
Date: Fri, 27 Apr 2018 14:18:47 GMT
Content-Type: text/html; charset=UTF-8
Transfer-Encoding: chunked
Connection: keep-alive
Vary: Accept-Encoding 中间这里是响应头信息
Cache-Control: max-age=0
Content-Language: zh-CN
Set-Cookie: black_passportid=1; domain=.sogou.com; path=/; expires=Thu, 01-Dec-1994 16:00:00 GMT
Expires: Fri, 27 Apr 2018 14:18:47 GMT
Content-Encoding: gzip
--- 这里是空行
上述是状态行 响应头信息 响应正文
状态码分为5类
状态码 概要
1XX 处理正在继续请求稍后
2XX 成功
3XX 重定向
4XX 客户端错误
5XX 服务器错误
Content-Length -- 表示显示响应内容的字节数
Content-Type -- 一般指定的是MIME类型,常见的有如下形式:
MIME类型 含义
text/plain 文本
text/html HTML文档
application/xml XML文档
text/css CSS
mage/gif GIF图像
image../Image/ PNG图像
application/pdf PDF文档
POST方法
POST /admin HTTP/1.1
Host: login.qq.com
Connection: keep-alive
Content-Length: 767
Cache-Control: max-age=0
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,/;q=0.8
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.221 Safari/537.36 SE 2.X MetaSr 1.0
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.8
Cookie: lidd=40800d25c429b2407c417d87c16deba46da42988bfcfa3f9
username=&action=LoginAction=ff --- 此处被称为消息体 一般在登陆界面提交用户名和密码
百分号编码
一般的情况下,你们可能会看到在访问URL中看到很多百分号,这是因为中文和特殊符号不能直接用在URL上,所有要用在URL上就需要经过百分号编码,百分号编码是将字符以字节为单位转换成%xx的形式,xx则为该字节的16进制写法。
Referer
Referer头信息有时候可以帮助我们提升安全性,但有时候却成为问题之源。
所以当URL中包含敏感信息时,Referer就可能会引发安全问题,比如URL中含有会话ID,那么就会通过Referer泄露给外界。
GET和POST区别
GET 方法仅用于查阅(获取资源)
GET 被认为没有副作用意思是指不存在像POST那样含有更新 删除服务器端数据的操作
发送敏感数据时应使用POST方法
GET方法一般去请求过程中是使用URL后紧跟查询字符串的形式来传递每个参数,但是由于浏览器和服务器能够处理URL的长度有限制,所以GET方法有个弊端就是在浏览器地址栏有长度限制,并且GET方法容易泄露敏感信息。而POST方法很安全,通常用于传递敏感信息。
GET方法含有两个明显的风险如下:
1.URL中指定的参数会被Referer泄露
2.URL中指定的参数会残留在访问日志中(Access-log)
HTTP认证
HTTP支持的认证:Basic认证,NTLM认证和Digest认证,HTTP是无状态的协议,认证同样也是。
目前只用了解Basic认证,这个认证是401 认证,属于无状态认证,既然是无状态认证,那么就不存在注销的概念,所以在使用了401认证,通过查看HTTP请求信息会发现一个授权的字样和进行base64的编码的用户名和密码,这种方式存在安全隐患,一旦泄露,相当于直接泄露了用户名和密码,对付这种方式目前的一种办法就是使用https对其加密传输就可以了。
Cookie与会话管理
由于上面已经讲述HTTP是无状态协议,所以为了更方便的实现会话管理,HTTP引入了名为Cookie的机制,这里就相当于服务器下达给浏览器的命令,让其记住发送给它的“名称=变量"这种格式的值。
会话ID -- SessionID 安全
1.SessionID不能被第三方推测
2.SessionID不能被第三方劫持
3.SessionID不能被第三方泄露
PS:SessionID不能被第三方推测,这个很好理解,如果SessionID有规律的话,那么相当于我可以根据规律不需要账号和密码就可以登录其他人的账号和密码了,所以SessionID不能被第三方推测。
SessionID不能被第三方劫持,这里的劫持意思根本点讲正常用户登录使用的SessionID被旁边的人偷偷查看了,或者内外嗅探,流量劫持找到了有效期内的SessionID,导致恶意攻击者直接使用该SessionID进行无需密码登录网址,这也是常说的会话固定(Session Fixation Attack)
SessionID不能被第三方泄露,因为安全是相对的,所以我们要想到最坏的打算,那么假如SessionID真的泄露了,就有可能发生伪装事件,所以要采取必要的方法措施。
其中SessionID泄露的常见几个原因如下:
1.发现Cookie属性指定的有问题,没有遵守对于的安全规范。
2.SessionID在网络中被监听。
3.通过XSS漏洞获取SessionID,导致泄露。
4.SessionID保持在URL的中的情况下,被Referer消息头泄露。
所以要解决如上SessionID的安全问题就需要对Cookie做如下的安全标准规范。
1.要求开发在写代码的过程中给定Cookie以采用SSL(Secure Socket Layer)加密的方法,同时Cookie的属性指定需要符合含有Domain,Path,Expires,Secure,HttpOnly。
Domain Cookie需要发送给对象域名的范围是哪个域名要指清楚
Path Cookie发送对象域名对于的URL路径范围
Expires Cookie的有效期,一般未指定表示浏览器关闭为止
Secure 仅在SSL加密的情况下发送Cookie
HttpOnly 指定此属性的Cookie不能被JavaScript访问
Domain安全: 在未指定Domain属性时,Cookie只被发送至生成它的服务器,这种未指定Domain属性的Cookie发送范围最小,最安全。
Secure安全:表示Cookie只能在SSL传输的情况下才能被发送,如果没有设置这个属性,那么不管是不是SSL传输都会发送Cookie,这样安全隐患很大。
HttpOnly安全:设置这个属性,JavaScript是不能访问Cookie,但是说的更清楚点,这种方式只是增加了攻击者的攻击难道,增加了其攻击成本而已,并没有真正的抵御了恶意攻击者的攻击。