本文正在参与 “网络协议必知必会”征文活动
DNS寻址
- 输入
http://www.baidu.com
- 本机
hosts
里有没有www.baidu.com
- 本机
hosts
里没有
- 本机
- 本地
DNS
缓存服务器(网络运营商,或者自建局域网的dns
服务)里有没有www.baidu.com
- 有:
www.baidu.com
这个域名的IP是XX.XX.XX.XX - 无:联系根域名
DNS
服务器,询问
- 有:
- 根域名
DNS
服务器- 有:
www.baidu.com
这个域名的IP是XX.XX.XX.XX - 无:无法访问网页
- 根域名服务器的类型
- 有:
- 在本地和根域名之间还可能存在多个
DNS
中间层- 权限域名服务区:一个服务器所负责管理的范围叫区
- 顶级域名服务商:既
TLD
服务器,这些域名服务器负责管理在该顶级域名服务器注册的所有二级域名。aliyunDNS
qqdns
等
HTTP
HTTP协议
超文本传输协议HTTP
(HyperText Transfer Protocol
)是互联网上应用最为广泛的一种网络协议,它详细规定了浏览器和万维网服务器之间互相通信的规则,通过因特网传送万维网文档的数据传送协议.
HTTP
协议通常承载于TCP
协议之上.
发起请求
- 请求行
- method
GET
POST
HEAD
PUT
DELETE
TRACE
CONNECT
OPTIONS
- RequestURL
http://wwww.baidu.com
- HttpVersion
Htp 1.1
- method
- 消息报头
- Accept 指定客户端接受哪些类型的信息/MIME
image/gif
text/html
等 - Accept-Charset 客户端接受的字符集
gb2312 utf-8
等 - Accept-Encoding 可接受的内容编码
gzip
identity
- Accept-Language 指定一种自然语言 zh-cn
- Authorization 证明客户端有权查看某个资源
- Host 指定被请求的Internet主机和端口号
192.168.0.110:8080
- User-Agent 用户代理
- 操作系统版本
- CPU类型
- 浏览器及版本
- 浏览器渲染引擎
- 浏览器语言
- 浏览器插件
- Content-Type Body的编码方式
- Accept 指定客户端接受哪些类型的信息/MIME
- 请求正文 根据头部的
Content-Type
确定- application/x-www-form-urlencoded eg:
key=value&name=jone
- application/json 序列化后的JSON字符串/ajax
- text/xml XML作为编码方式的远程调用规范
- text/plain 数据以纯文本形式(txet/json/xml/html)进行编码
- multipart/form-date 文本数据/文件等的二进制数据,允许在数据中心包含整个文件,所以常用于文件上传
- application/x-www-form-urlencoded eg:
处理响应
-
状态行 状态码
- 1xx 指示信息 表示请求已接受 继续处理
- 2xx 成功 请求已被成功接收、理解
- 3xx 重定向 要完成请求必须进行更进一步的操作
- 4xx 客户端错误 语法有错误 或者请求无法实现
- 5xx 服务端错误 服务器未能实现合法请求
-
消息报头
- 响应报头
- location 重定向接受者到一个新的位置
- WWW-Authenticate 包含在401(未授权的)响应消息中,客户端收到401响应消息时候,并发送Authorization报头域请求服务器对其进行验证时,服务端响应报头就包含该报头域。
- 实体报头
- Content-Encoding 媒体类型的修饰符 eg:Content-Encoding:gzip
- Content-Language 资源所用的自然语言。没有设置该域则认为实体内容将提供给所有的语言阅读
- Content-Length 正文的长度,以字节方式存储的十进制数字来表示
- Content-Type 实体报头域用语指明发送给接收者的实体正文的媒体类型
- Expires 响应过期的日期和时间
- Etag
- Pragma
- 响应报头
-
响应正文
安全的HTTP
同源策略( Same-origin policy )
它允许来自同一站点的资源进行互相访问而不受限制,但是会阻止其他不同站点对文档/资源的访问。换句话说它可以阻止另一个站点通过脚本来操纵本站点的文档。同源的文档必须有相同的协议,主机名和端口号。
eg:http://www.aaa.com/index.html
可以嵌入 http://www.aaa.com/index.js
,因为他们同源。
而http://www.aaa.com
上的文档不能嵌入http://www.bbb.com
,因为他们不同源。
这样虽然很安全,但是其他服务访问内容就会产生麻烦,所以就有了跨域资源共享技术 CORS
。给其他非同源应用配置白名单(域名授权)的方式,来响应请求。
会话劫持( Session Hijacking )
我们知道HTTP
本身是无状态的。我们做会话保持的一种方式是服务器发送一个会话session
id
,浏览器可以在Cookies
中存储这个id
,并在下次会话中协带这个id
。
这就会带来一个问题,如果一个攻击者
拿到了这个会话id
,那么它就能轻松访问这个web应用了。
- 会话劫持的应对策略
-
重置会话:每次会话
服务器
会验证旧的id
,并签发新的id
。在下一个请求中,id
改变攻击者
就无法访问这个会话了。 -
设置会话过期时间:比如2小时,这样一来
攻击者
只能在有限的时间内访问这个web应用,过期就失效了。 -
使用
https
可以有效降低攻击者
获取id
的可能性。可以参考我前面写的文章HTTPS认证原理
-
跨站脚本攻击 (XSS)
- 一个例子 有个xx论坛,用户可以对帖子进行评论,而且评论信息会显示在当前帖子的评论列表里。 用户a评论了
<script>alert("hello world")</script>
那每次打开这个帖子就都会有弹窗了。
如果评论信息是html和css相关,就会影响帖子的内容和布局了。
- 跨站脚本攻击的应对策略
- 无害处理:消除输入的问题,比如处理输入的
html
的相关标签,或者使用Markdown
等的富文本编辑器。 - 转义输入数据:转义用户输入的
html
和javascript
数据,这样浏览器就不会把他们当做代码执行了。
- 无害处理:消除输入的问题,比如处理输入的