HTTP 和 Web 安全
在浏览器中输入 URL 到整个页面显示在用户面前,这个过程中到底发生了什么?
客户端寻找域名解析服务 — DNS 服务器解析域名,获取对应的 IP 地址 — 与 Web 服务器建立 TCP 连接 — 发送 HTTP 请求数据 — 服务器处理请求,并返回 HTTP 报文 — 浏览器解析,并渲染页面
Web 网络基础
与 HTTP 关系密切的协议: IP
、 TCP
和 DNS
。
负责传输的 IP 协议
IP 协议位于网络层,它的作用是把各种数据包传送给对方。
IP 协议需要包含两个最重要的条件: IP 地址 和 MAC 地址 。
IP 地址 指明了节点被分配到的地址, MAC 地址 是指网卡所述的固定地址。
确保可靠性的 TCP 协议
TCP 协议位于传输层,它提供可靠的字节流服务。
为了确保数据准确的传输到目标处,TCP 协议采用了三次握手策略。
为了方便通信,TCP 协议将 HTTP 请求报文分割成报文段来发送给对方。服务器端接收到报文段后将其重组处理。
负责域名解析的 DNS 服务
DNS ( Domain Name System ) 服务位于应用层,它提供与域名到 IP 地址之间的解析服务。
URI 和 URL
URI 是统一资源标识符,用字符串的方式来标识某一互联网资源,使资源具有独一无二的 ID 标识。
URL 是统一资源定位符,标识资源在互联网上所处的地址,是 URL 的一种表现形式,是 URI 的子集。
HTTP 协议
HTTP 是一种不保存状态,即无状态( stateless )协议。
随着 Web 的不断发展,一些使用场景比如电商购物中,期望知道用户的名称和状态,因此引入了 Cookie 技术。
方法
HTTP/1.1 中可用的方法: GET / POST / PUT / HEAD / DELETE / OPTIONS / TRACE / CONNECT
。
状态码
当客户端向服务器端发送请求时,状态码用来描述返回的请求结果。
1 | 1. 2XX 成功 |
HTTP 与 HTTPS
HTTP 的缺点
- 通信使用明文(不加密),内容可能会被窃听
- 不验证通信方的身份,因此可能遭遇伪装
- 无法证明报文的完整性,所以有可能已遭篡改
HTTP + 加密 + 认证 + 完整性保护 = HTTPS
HTTPS 并非是一种新的协议,只是 HTTP 通信接口部分用 SSL 和 TLS 协议代替而已。
- 加密处理防止被窃听:SSL 或 TLS 协议提供通信报文的内容加密
- 查明对手的证书:SSL 使用证书的手段,来判断对方的真实身份,证书由值得信任的第三方机构颁发
- 防止内容被篡改:SSL 提供认证和加密处理以及摘要功能
HTTPS 的局限
- SSL 通信慢,除去和 TCP 连接、发送 HTTP 请求意外,还必须进行 SSL 通信,整体通信量会变大
- SSL 必须进行加密处理,在客户端和服务器端都会消耗 CPU 和内存等资源,导致处理速度变慢
- 需要额外的开支用于购买第三方认证证书
Web 的攻击技术
因输出值转义不完全引发的安全漏洞
跨站脚本攻击 Corss-Site Scripting, XSS
它是指通过存在安全漏洞的 Web 网站注册用户的浏览器内运行非法的 HTML 标签或 JavaScript 来进行的一种攻击。
- 利用虚假输入表单骗取用户个人信息
- 利用脚本窃取用户的 Cookie 值
- 显示伪造的图片和文章
例如:
1 | // 攻击者将恶意代码隐藏入欺诈邮件或者 Web 页面中,诱导用户去点击该 URL |
SQL 注入攻击
SQL 注入是指针对 Web 应用使用的数据库,通过运行非法的 SQL 而产生的攻击。
- 非法查看或篡改数据库内的数据
- 规避认证
- 执行和数据库服务器业务关联的程序等
OS 命令注入攻击
它是指通过 Web 应用,执行非法的操作系统命令达到攻击的目的。
HTTP 首部注入攻击
它是指攻击者通过在相应首部字段内插入换行,添加任何响应首部或主体的一种攻击。
- 设置任何 Cookie 信息
- 重定向至任何 URL
- 显示任意的主体(HTTP 响应截断攻击)
因会话管理疏忽引发的安全漏洞
会话劫持
会话劫持是指攻击者通过某种手段拿到用户的会话 ID ,并非法使用此会话 ID 伪装成用户,达到攻击的目的。
跨站点请求伪造
跨站点请求伪造( Cross-Site Request Forgeries,CSRF ) 攻击是指攻击者通过设置好的陷阱,强制对已完成认证的用户进行非预期的个人信息或设定信息等某些状态的更新,属于被动攻击。
良好的习惯和防范措施
- 永远不要相信客户端传来的任何信息,对这些信息都应先进行编码或过滤处理;
- 谨慎返回用户输入的信息;
- 使用黑名单和白名单处理(即“不允许哪些敏感信息”或“只允许哪些信息”,白名单的效果更好但局限性高);
- 检查、验证请求来源,对每一个重要的操作都进行重新验证;
- 使用SSL防止第三方监听通信(但无法阻止XSS、CSRF、SQL注入攻击);
- 不要将重要文件、备份文件存放在公众可访问到的地方;
- 会话ID无序化;
- 对用户上传的文件进行验证(不单单是格式验证,比方一张gif图片还应将其转为二进制并验证其每帧颜色值<无符号8位>和宽高值<无符号16位>);
- WSDL文档应当要求用户注册后才能获取;
- 在报头定义CSP(Content Security Policy);