这是我参与「第五届青训营 」笔记创作活动的第9天。
本堂课重点内容
本节课从攻击篇和防御篇两个方向介绍了Web开发安全相关内容。
详细知识点介绍
攻击篇
XSS跨站脚本攻击
作为开发者,盲目信任用户提交内容 + 直接将用户提交字符串转化成了DOM。
特点:
- 很难从UI上感知
- 窃取用户信息(cookie/token)
- 绘制UI,诱骗用户点击/填写表单
分类:
- 存储型XSS攻击,恶意脚本被存在数据库中
- 反射型XSS攻击,在服务端进行注入
- DOM型XSS攻击,在浏览器侧注入
- Mutation型XSS攻击,利用浏览器渲染机制
CSRF跨站伪造请求
在用户不知情前提下,利用用户权限,构造指定的HTTP请求,窃取或修改用户敏感信息。
举例:用户没有访问银行页面,但银行的服务器被请求了。
injection 注入攻击
最常见的是SQL注入攻击。也有CLI注入,OS command等。
SQL注入:
CLI注入:
DoS
通过某种方式构造特定请求,导致服务器资源被显著消耗,来不及响应更多的请求,导致请求被挤压,进而雪崩效应。
ReDoS:基于正则表达式的DoS。
DDoS:短时间内来自大量僵尸设备的请求。(SYN Flood)
中间人攻击
可以由恶意webview,路由器,ISP等在传输层进行攻击。
发生原因:
- 明文传输
- 信息篡改不可知
- 双方未进行验证
防御篇
XSS
永远不要相信用户提交的内容,永远不要将用户提交的内容作为DOM。
前端:
- 主流框架默认防御XSS(innerHTML)
- google-closure-library
服务端:
- DOMPurify
如果用户有必须上传DOM的需求,可以使用new DOMParser(),对于用户上传的svg,也要对其中内容进行检查(其中可以插入script标签),小心自定义跳转和自定义样式。
CSP Content Security Policy
内容安全策略:
- 规定呗认为是安全的源(域名)
- 来自安全源的脚本可以执行,否则直接报错
- 减少对
eval和inline script的使用。
服务器设置响应头部,浏览器设置meta标签。
CSRF
核心:判断请求来自合法来源。
方案一:对请求同步的Origin、Refer进行校验。
方案二:token。
iframe攻击:iframe中发出的请求是同源请求,可以通过配置X-Frame-Options来防御。
GET !== GET + POST
避免用户信息被携带:SameSite Cookie,其他页面不能使用此页面的Cookie(判别根据:页面域名与domain属性是否一致)。
SameSite Cookie设置为none则可以被第三方携带。
Injection
- SQL注入:找到使用SQL的地方,使用
prepared statement。 - 最小权限原则:
sudo||root - 建立允许名单+过滤
- 对URL类型参数进行协议、域名、ip等限制
Dos
- ReDos:完善
Code Review。 - 代码扫描 + 正则性能测试
- 拒绝使用用户提供的正则
DDos:
传输层————防御中间人
HTTPS:
- 可靠性:加密
- 完整性:MAC验证
- 不可抵赖性:数字签名
SRI
静态资源劫持:对比hash。