Web开发的安全之旅(防御篇)|青训营笔记
这是我参与「第四届青训营」笔记创作活动的的第8天。
Web安全一窥
安全问题“很常见”,会危害用户、公司、程序员。
下面将从攻击与防御两个角度看Web安全,本文为防御篇。
假如你是一个开发者——防御篇
XSS
- 永远不信任用户的提交内容
- 不要将用户提交内容直接转换成DOM
现成工具
- 前端
- 主流框架默认防御XSS
- google-closure-library
- 服务端(Node)
- DOMPurify
Content Security Policy(CSP)
内容安全策略。
- 哪些源(域名)被认为是安全的
- 来自安全源的脚本可以执行,否则直接抛错
- 对
eval + inline script说“no”
CSRF
if 伪造请求异常请求
then 限制请求来源限制伪造请求
- origin
- 同源请求中,GET + HEAD 不发送
- Referer
token
- 用户绑定:攻击者也可以是注册用户===可以获取自己的token
- 过期时间:【前向保密】
iframe攻击
- X-Frame-Options: DENY/SAMEORIGIN
anti-pattern
GET !== GET + POST
避免用户信息被携带:SameSite Cookie
限制:
- Cookie domain
- 页面域名
SameSite vs CORS
| SameSite | CORS |
|---|---|
| Cookie发送 | 资源读写(HTTP请求) |
| domain vs 页面域名 | 资源域名 vs 页面域名 |
| “我跟你说个事儿,出这屋我可就不认了” | 白名单 |
正确姿势
使用中间件生成各种防御策略,而不是case by case。
Injection
SQL
- 找到项目中查询SQL的地方
- 使用
prepared statement
beyond SQL
- 最小权限原则
- sudo || root
- 建立允许名单+过滤
- rm
- 对URL类型参数进行协议、域名、ip等限制
- 访问内网
Regex DoS
- Code Review(拒绝
/(ab*)+/) - 代码扫描+正则性能测试
- 拒绝用户提供的使用正则
DDoS
- 流量治理
- 负载均衡
- API网关
- CDN
- 快速自动扩容
- 非核心服务降级
传输层
防御中间人
使用HTTPS。
HTTPS的一些特性:
- 可靠性:加密(身份)
- 完整性:MAC验证(篡改)
- 不可抵赖性:数字签名(身份)
HTTP Strict-Transport-Security(HSTS):将HTTP主动升级为HTTPS。需要先有一次HTTPS访问。
Subresourse Intergrity(SRI)
通过对比hash,防止静态资源(CDN)被劫持篡改。
FeaturePolicy/Permission Policy
限制一个源(页面)下,可以使用哪些功能:camera、microphone、autoplay……在被XSS攻击后限制页面功能。
尾声
- 安全无小事
- 使用的依赖(npm package,甚至事NodeJS)可能成为最薄弱的一环。
- 保持学习心态