这是我参与「第五届青训营 」伴学笔记创作活动的第17天
Web安全之道
Web安全一窥
根据 HackerOne 的报告数据,71% 的安全问题都出现在网站上,其次是一些 API 接口,而这些接口很大一部分都来自 Web 。
可以说,网站安全攻防(我们俗称 Web 安全),占比通常达到了 80%以上。Web 安全是最受外部黑客关注的目标,也是企业应该重点防御的对象。
不论你是后端还是前端,都应该意识到 Web 安全与整个开发团队成员都有关,当不可逆的安全问题发生时,只有熟悉安全攻防技术,才有化危为安的可能。
安全问题其实“很常见”,对于用户、公司以及程序员都有很大影响。
两个角度看Web安全
攻击篇(As Hacker)
Cross-Site Scripting(XSS)
跨域脚本攻击,当用户访问页面时恶意脚本会被执行
XSS主要利用了:盲目信任用户提交的内容+直接将字符串转换为DOM
特点:
- 通常难以从UI上感知(暗地里执行脚本)
- 窃取用户信息(cookie/token)
- 绘制UI(弹窗等),诱骗用户去填写提交
分类:
- Stored XSS:恶意脚本被存在数据库中
- Reflected XSS:不涉及数据库,从URL上攻击
- DOM-based XSS:不需要服务器参与,全在浏览器完成
- Mutation XSS:利用不同浏览器渲染DOM的特性,按浏览器进行攻击
Cross-Site request forgery(CSRF)
跨域伪造请求, 在用户不知情下,构造用户权限(cookie),构造指定HTTP请求,窃取或修改用户信息
SQL Injection
SQL注入,在请求是恶意注入SQL参数,服务端运行该SQL code,达到获取、修改或删除其他数据目的。
Injection不止SQL:
- CLI
- OS command
- Server-Side Request Forgery(SSRF)
Denial of Service(DoS)
服务拒绝,通过某种方式构造特定请求,导致服务器资源被显著消耗,无法响应更多请求,导致雪崩效应。
-
ReDoS:基于正则表达式的DoS,向贪婪模式的正则传入容易发生回溯行为的字符串。
-
DDos(Distributed DoS):短时间内,来自大量僵尸设备的请求流量,服务器不能及时完成全部请求。
特点:
不会局限于域名和接口,主要消耗带宽
中间人攻击
主要利用了:明文传输+信息篡改不可知+对方身份未验证
防御篇(As Developer)
针对XSS
永远不要相信用户提交的任何内容,不要将用户提交内容直接转换成DOM
现成工具:
- 主流前端框架默认防御XSS
- google-closure-library
- DOMPurify
注意:(以下操作有被XSS攻击的风险)
- string—>DOM
- 上传svg
- Blob动态生成script
- 自定义样式
Content Security Policy(CSP)
内容安全策略,可以去定义那些源(域名)是安全的,对来自安全源的脚本是可以执行的,对eval+inline script说不。
//服务器响应头
Content-Security-Policy: script-src 'self'
Content-Security-Policy: script-src 'self' https://domain.com
//浏览器
<meta http-equiv="Content-Security-Policy" content="script-src self">
针对CSRF
根据请求的Origin和Referer判断请求来源,同源请求中,GET和HEAD不发送Origin
利用token进行防御:用户绑定+过期时间
iframe攻击:
攻击者可以采在iframe标签中嵌套button,进行同源请求,从而完成一次CSRF攻击。
SameSite Cookie—避免用户信息被携带
针对Injection
找到项目中SQL的地方,使用prepared statement提前编译语句
- 最小权限,不要使用sudo或root
- 建立白名单+过滤,将rm等高危命令排除
- 对URL类型参数进行协议、域名、ip等限制
针对RDoS
- Code Review拒绝贪婪模式的正则
- 代码扫描+正则性能测试
- 拒绝用户提供的实验正则
针对DDoS
- 流量治理(负载均衡、API网关、CDN)——过滤
- 快速自动扩容 ——抗量
- 非核心业务功能降级(关闭)——抗量
防御中间人——HTTPS
- 可靠性:加密传输
- 完整性:MAC验证
- 不可抵赖性:数字签名
Subresource Integrity(SRI)
对比标签hash值,判定CDN静态资源是否被攻击者篡改。