这是我参与「第五届青训营」伴学笔记创作活动的第 10 天
本堂课重点内容
本堂课分别从攻击者和防御者两个角色出发,讲解了Web开发时存在的安全问题和防范措施,本篇文章主要记录了Web开发的防御技术。
Web开发安全——防御篇
- 跨站脚本攻击XSS防御
- 原则:永远不要信任用户提交内容,不能直接转换成DOM而是转换成字符串
- 前端主流框架都是默认防御XSS攻击的,也有工具:google-closure-library
- 服务端(Node)使用DOMPurify
- 如果非要动态生成DOM
- new一个DOM的时候一定要对string进行转义
- 扫描svg图片
- 尽量不允许用户自定义跳转行为
- 内容安全策略CSP(Content Security Policy)
-
基于同源策略:协议、域名、端口都相同
-
由开发者定义哪些源是安全的,安全源脚本可以执行,非安全源的抛出错误
-
服务器响应头部
Content-Security-Policy: script-src 'self' https://domain.com -
浏览器的meta
<meta http- equiv="Content-Security-Policy" content="script-src self">
-
- CSRF的防御
- 原则:限制请求来源 => 限制伪造请求
- Origin + Referrer 形式
- 校验token,token应该设置有效期
- iframe攻击:http响应头 ,X-Frame-Options: DENY(不能加载iframe)/ SAMEORIGIN(必须同源)
- anti-pattern:不能将GET、POST写成同一个
- SameSite Cookie:“我页面的Cookie只能为我所用”,从根源解决
-
限制条件:Cookie domain属性和当前页面域名是否匹配
-
第一方Cookie ✔;第三方Cookie ✘
-
依赖第三方Cookie服务怎么办
Set -Cookie: SameS ite=None; Secure;
-
- 从node层面讲:生成中间件,专门防御CSRF
- Injection
- 找到项目中查询SQL的地方,使用prepared statement
- 最小权限原则
- 建立白名单
- 对URL类型参数进行协议、域名、ip的限制
- DoS
- 基于正则:避免贪婪匹配;使用代码扫描工具,进行正则性能测试;拒绝用户使用的正则
- 防御关键:流量治理、快速扩容、非核心服务降级
- 传输层
- 防御中间人:使用https
- https特点:可靠(TLS加密层)、完整(MAC验证)、不可抵赖性(数字签名)
- HSTS 将http主动升级成https,需要先有一次https请求
- SRI
个人总结
正所谓“防人之心不可无”,开发者在开发时要留个心眼,安全无小事,使用第三方依赖也可能会带来漏洞。另外,黑客的攻击技术也是在不断成长的,为了保护我们自己的技术成果和客户隐私,我们也要不断学习和成长。
老师推荐课后读物
SameSite 那些事 Amazon.com: Web Application Security: Exploitation and Countermeasures for Modern Web Applications