安全指南
Web 开发中常见的安全问题如下:高危攻击、普通攻击、过时攻击。
高危攻击
高危攻击是指会产生重大安全影响的攻击方式,包括:中间人攻击、跨站点请求伪造、SQL 注入。
1 中间人攻击
中间人攻击(MitM,Man-in-the-middle attack)就是在消息发出方和接收方之间拦截、篡改消息。
中间人攻击的示例:Wi-Fi 路由器就可以被破解用来进行中间人攻击。
中间人攻击的防御手段一般有两种:HTTPS、数据加密。
1.1 HTTPS
1.1.1 定义
HTTPS(超文本传输协议安全)是 HTTP 协议的加密版本,它使用 SSL 或 TLS 协议来对客户端和服务器之间的所有通信进行加密。
SSL(Secure Sockets Layer,安全套接层)是旧的标准安全技术,用于在服务器和客户端之间创建加密的网络链路,确保传递的所有数据都是私密且安全的。SSL 的当前版本是 Netscape 于 1996 年发布的 3.0 版本,已被 TLS 协议取代。
TLS(Transport Layer Security,传输层安全)协议是在两个互联的应用或设备上稳定且私密地交换信息的标准。TLS 要求服务器提供一个有效的digital certificate(数字证书)来确认身份以建立安全连接。如果客户端和服务器都能提供自己的数字证书,则它们可以互相认证。
TLS 中的数字证书是证书颁发机构(CA),为了保证证书发放的安全性,订立了一个叫证书透明度的机制。
证书透明度(Certificate Transparency,CT)是一个开放的框架,旨在监测和防止证书的误发,它会将新颁发的证书会被“记录”到公开运行的、通常是独立的 CT 日志中,从而让公众审查和监督。
1.1.2 混合内容
在 HTTPS 的网页中可能包含 HTTP 的资源,这样的网页叫混合页面,其中的 HTTP 资源叫混合内容。
混合内容会导致 HTTPS 网页不安全,可以分为两种:
第一种,混合显示内容,也叫混合被动内容,是不能更改网页的内容,包含:图片、音频、视频等。混合显示内容对网页的威胁较低,可能导致用户看到误导性的内容,也可能导致用户行为被黑客推断出来。
第二种,混合活动内容,是能够更改网页的内容,包含:Ajax 请求、script、link、iframe 等。混合活动内容对网页的威胁很高,可能导致用户信息泄露,也可能导致用户系统被安装恶意软件。
现在一般的浏览器都不允许混合被动内容和混合活动内容,所以一般不需要特殊处理。
1.2 数据加密
数据加密是对前后端之间传输的数据进行加密,用于对安全性要求高的网站。
数据加密可以采用 RSA + AES + SHA256 的方案:先对数据进行 AES 加密,再对 AES 秘钥进行 RSA 加密,再对整体数据进行 SHA256 签名。
数据加密相当于基于 HTTPS 的双重加密,而且在浏览器的控制台看到的也是密文。
2 跨站点请求伪造
2.1 定义
跨站点请求伪造(CSRF,Cross-site scripting):利用用户的登录信息执行不安全的请求。
CSRF 的常见场景:图片、超链接、表单等。
CSRF 的具体方案:当用户登录过目标网站之后,会保存登录信息(通过 Cookie),此时黑客欺骗用户访问自己的网站,并在自己的网站中自动(或者欺骗用户手动)发送不安全的请求(比如:给黑客转账),由于浏览器还存有登录信息,服务器就会认为是用户自己发送的请求,于是就会执行这个不安全的请求,从而造成用户的损失。
CSRF 并不是随便就能实现的,需要满足以下条件:
- 黑客发送的请求需要绕过浏览器的同源策略,也就是黑客的网站能够给目标网站发请求。这一点可以通过同源策略的漏洞实现。
- 网站的 Cookie 支持跨站访问,也就是黑客网站发送的请求能够自动携带用户保存的 Cookie。这一点需要网站自己开启。
同源策略的漏洞就是只对部分请求(比如:Ajax 请求)进行限制,对以下请求不会限制:
- 直接通过
window.location.href=xxx进行重定向跨域 - 通过
form表单提交post或get请求 - 通过一些标签的
src属性或href属性进行跨域请求 - 通过
iframe跨域
2.2 简单示例
下面通过一个简单示例演示具体流程:
第一步,用户登录目标网站(http://127.0.0.1:8001)并保存登录信息,比如:
// SameSite=None 表示支持跨站访问
document.cookie = 'id=1234567;Domain=127.0.0.1;SameSite=None;Secure;';
第二步,用户打开恶意网站(http://localhost:8001),并自动发送不安全的请求,比如:
<html lang="zh-CN">
<body>
<form action="http://127.0.0.1:8001/money" method="post">
<input type="text" name="money" value="100" />
<input type="submit" />
</form>
<script>
document.forms[0].submit();
</script>
</body>
</html>
第三步,服务端收到请求,验证 Cookie 通过并执行相应的操作。
2.3 防御手段
CSRF 的防御手段有以下几种:
第一种,SameSite,用于指定是否允许跨站请求携带 Cookie。将 SameSite 设为 Strict 后,黑客的网站就无法获取目标网站的 Cookie 了
第二种,Web Storage,用于在当前站点保存数据。将登录数据存在 Web Storage 后,黑客的网站也无法获取登录信息。
3 SQL 注入
3.1 定义
SQL 注入(SQL Injection)就是向服务端中插入恶意的 SQL 代码。
SQL 注入的常见场景:Web 表单
SQL 注入的具体方案:在表单录入时,输入单引号和 or 组成的 SQL 代码,当服务器根据用户的输入(恶意的 SQL 代码)执行 SQL 语句时,由于 or 运算符的存在,便会绕过用户验证进行操作,从而实现对数据库的入侵。
3.2 简单示例
下面通过一个简单示例演示具体流程:
第一步,在后端定义登录的 SQL语句,比如:
"SELECT Count(*) FROM Users WHERE Username=' " + txtUser+" ' AND Password=' "+ txtPassword+" ' ";
第二步,在 Web 表单中输入以下内容:
txtUser: admin
txtPassword: anything 'or'1'='1
第三步,在后端拼接 SQL 语句,比如:
"SELECT Count(*) FROM Users WHERE Username=' admin ' AND Password=' anything 'or'1'='1 ' ";
第四步,执行 SQL 语句并查询到 admin 用户,于是登录成功,黑客就可以随便操作前端页面了。
3.3 防御手段
SQL 注入 的防御手段有以下几种:
第一种,对 Web 表单中的特殊字符进行转义,比如:将 ' 转义为 " ,这样用户输入的内容就完全变成查询条件了。
普通攻击
普通攻击是指会产生相对较小的安全影响的攻击方式,包括:点击劫持、拒绝服务攻击。
1 点击劫持
1.1 定义
点击劫持(ClickJacking)就是欺骗用户执行未知的操作。
点击劫持的常见场景:骗关注
点击劫持的具体方案:在黑客的网站上面,通过 iframe 叠加一个透明的目标网页,当用户点击黑客网站上的某个地方时,实际上点击的是目标网页的某个地方
1.2 防御手段
点击劫持的防御手段:使用 X-Frame-Options 响应头,禁止网站被 iframe 加载。
2 拒绝服务攻击
2.1 定义
拒绝服务攻击(DoS,Denial of Service)是一种网络攻击手段,它通过给服务器发送大量请求来阻止对资源的合法使用。
计算机资源有限,比如算力和内存。当这些资源过载时,程序可能会发生冻结或崩溃,使程序不可用。DoS 攻击结合多种技术来消耗资源,使合法用户无法使用服务器或网络,或者至少让服务器反应迟缓。
分布式拒绝服务(Distributed Denial of Service,DDoS)攻击是一种使用大量服务器来耗尽一台被攻击电脑的资源的攻击方式。
2.2 防御手段
防御手段:通过请求频率判断是否恶意请求,如果是就对其进行封禁。
过时攻击
过时攻击是在谷歌浏览器中测试已失效的攻击方式,包括:跨站脚本攻击。
1 跨站脚本攻击
跨站脚本攻击(XSS,Cross-site scripting )就是向网页中插入恶意脚本代码。
- 常见场景:论坛留言。
- 具体方案:通过 URL 参数、表单录入、控制台修改 DOM 的方式,向网页中插入恶意脚本代码(比如:script 元素),从而在脚本自动执行时攻击用户。
- 过时原因:浏览器会将插入的脚本代码当做字符串处理,而不是 HTML 元素。