这是我参与「第五届青训营 」笔记创作活动的第19天。
一、本堂课的重点内容
二、详细知识点介绍
XSS
永远不要信任用户提交的内容,不要将用户提交的内容直接转换成DOM
用户提交的内容当做字符串对待
前端:主流前端框架已经默认防御XSS,google-closure-library
服务端:DOMPurify等npm包也实现了XSS的防御
如果需要接收用户传来的富文本,需要动态生成DOM
对于new DOMParser()这样的api,则需要对用户提交的字符串进行转译
若允许用户上传的svg,则需要对svg进行扫描,因为svg可以嵌入script标签
要限制用户的自定义跳转行为,也要限制用户自定义样式,详见下面的例子。
同源策略SOP,Same Origin Policy
同源就是协议、域名、端口号全都相等。
一般对于http而言,同源请求没啥问题,但跨域的请求可能出现问题。
内容安全策略CSP,content security policy
定义哪些源(域名)被认为是安全的,来自安全源的脚本可以执行,否则直接报错,对eval和inline script直接报错。
// 服务器端响应头部
Content-Security-Policy: script-scr 'self' // 同源
Content-Security-Policy: script-scr 'self' https://domain.com // 还允许另一个域名的script标签执行
// 浏览器meta
<meta http-equiv="Content-Security-Policy" content="script-src self">
CSRF
伪造请求的来源是异常来源,限制请求的来源以限制CSRF攻击。
服务端对请求的Origin和Referer进行校验,是自己的域名就响应请求,不是就不响应
同源请求中,get和head请求不会发送Origin字段
除了Origin和Referer,如果一个请求来自合法的页面,则服务器肯定接收过这个页面的请求,因为是现有页面后有请求,则服务器可以标识这个页面,也就是通过token进行标记。
这个token是和具体用户进行绑定的,确保不会被其他的注册用户利用。
token还要有过期时间,以免token被泄露就会一直被利用。
CSRF的iframe攻击
如图所示,攻击者设置了一个按钮,这个按钮的样式设置为pointer-events: none,则按钮的点击事件会穿透到下面,而下面是一个iframe,是一个合法的页面,以此抵抗Origin检查。
对于这种攻击,可以设置http响应头X-Frame-Options: DENY或者SAMEORIGIN,deny就是当前页面不能作为iframe进行加载,sameorigin要求必须是同源的页面才能加载iframe。
SameSite Cookie
由于CSRF用的是用户权限,而用户权限在Cookie中,则如果请求中不带有cookie,就可以避免这种CSRF的方式。
假设当前页面,对应的域名是A,此时所有Domain属性是A的cookie,称为第一方cookie,否则称为第三方cookie。向Domain A发起请求时,所有第一方cookie可以被成功带上,而第三方cookie带不上。
如果有依赖cookie的第三方服务?如当前页面内嵌一个第三方站点的播放器,需要第三方站点的cookie来识别,否则发不了弹幕。
则可以设置响应头Set-Cookie: SameSite=None; Secure;关闭SameSite的限制,而标记cookie是secure的。
综上所述;在服务端设置一个中间件,用来以各种形式防御CSRF
Injection
找到项目中查询SQL的地方,使用prepared statement,将SQL语句提前编译,避免SQL injection
对于其他的注入攻击:
- 最小权限原则,sudo或root权限不要给
- 建立白名单并过滤,只允许指定命令执行,拒绝rm等命令执行
- 对URL类型参数进行协议、域名、IP等限制,避免攻击者访问内网资源
DoS/DDoS
DoS:
- 进行Code Review,避免写出贪婪匹配的正则表达式,特别是在接口处理相关操作中
- 对整个项目的正则代码进行扫描,进行正则性能测试
- 拒绝使用用户提供的正则
DDoS:
- 流量治理:负载均衡、API网关、CDN
- 快速自动扩容:流量激增时有快速扩容方案
- 非核心服务降级:匀出更多资源应对激增的流量
传输层防御
防御中间人攻击,加密TLS,http3内置了tls
- 可靠性:加密
- 完整性:MAC验证
- 不可抵赖:数字前面
HTTP Strict-Transport-Security(HSTS)
将http主动升级到https,首先由浏览器向服务器发起https,服务器的响应头会带有Strict-Transport-Security: max-age=3600即3600秒内,若浏览器发起了http请求,则自动转成https。但需要现有一次https访问才行。
Subresource Integrity(SRI)
检验CDN的静态资源是否被篡改,浏览器会对拿到的代码进行hash计算,与标签中的hash值进行对比
<script src="..." integrity="sha384-{hash-value}" crossorigin="anonymous">...</script>
Feature Policy/Permission Policy
提供开发者在页面下使用相机、麦克风、视频自动播放等功能。即使被xss攻击,这个策略也能限制页面对用户设备的访问权限
iframe标签提供了allow属性,也可以实现类似的功能。
三、实践练习例子
XSS
自定义样式的XSS
只有用户点击了特定月收入的radio按钮,才会触发URL访问,这样攻击者就获得了用户的月收入信息。
四、课后个人总结
本节课学习了常见Web攻击的防御策略,Web攻击类型多样,攻击形式层出不穷,为应对多种Web攻击,浏览器和服务端都提供了一系列Web攻击的防御策略。开发者在开发网站时要提高安全意识,及时更新版本,了解新的特性,并注意编程习惯和编程素养的形成,避免留下漏洞给攻击者可乘之机。
五、参考链接
Cookie的SameSite属性_coder_coan的博客-CSDN博客_samesite
什么是HSTS,为什么要使用它? - 知乎 (zhihu.com)
特征策略 Feature Policy(iframe内功能控制)_windrainpy的博客-CSDN博客
Web 开发的安全之旅.pptx - 飞书云文档 (feishu.cn)