这是我参与「第五届青训营 」伴学笔记创作活动的第 14 天
一、本堂课重点内容:
- XSS 的防御
- 防御 CSRF 的正确姿势
- 防御 DoS
- 防御 Injection
- 防御中间人
二、详细知识点介绍:
XSS的防御
核心思想
永远要认为用户坏滴很,永远不要信任用户的提交内容,永远不要将用户提交内容之间转换为DOM
防御XSS的现成工具
前端
- 主流框架默认防御XSS
- google-closure-library
服务端(Node)
- DOMPurify
如果用户不讲武德
如果用户的要求就是要我们动态生成DOM,那么就没有什么特别完美的方法,只能说要注意以下几个点
- 如果String一定要转义
- 如果允许上传svg,那么一定要对svg文件进行扫描。因为svg图片允许插入script标签,如果图片加载那么就会执行。
- 尽量不要让用户自定义跳转,如果要做那么也要做好过滤,因为自定义连接可以传递script标签
- 如果允许用户自定义样式那么也有可能被攻击。下面这个就是某些收入选中了就会发送请求,然后攻击者就会知道某些人的收入是怎么样的。
CSPF防御
限制异常来源
CSRF会有异常来源的请求,所以只要限制了异常来源的请求,那么就可以防御CSRF攻击
使用token
还可以利用token
注意:
- token是和用户绑定的,因为攻击者也可能是注册用户,可以获取自己的token
- 一定要设置token过期时间,因为世界上没有绝对的安全措施
iframe攻击
你看似点击了button,实际你是点击了叠在下面的东西
可以这么防御,http响应头部可以利用,在服务器给所有页面设置这个头部:
- 如果deny,那么就不允许页面加载iframe
- 如果是SAMEORIGIN,那么必须是同源页面才能加载iframe
anti-pattern
一定不能为了偷懒而把get写成既能get又能post,不然攻击者既可以偷数据,还能修改用户数据
SameSite Cookie
既然攻击是通过别人拿到我的 cookie来操作,那我规定我的cookie只能我自己用,那么也能防御
也就是限制能带上cookie发送请求的范围
如果网站依赖第三方Cookie的服务,那么服务器可以把SameSite设置为none,也就是不对SameSie做出任何限制,但是你要标明这个cookie是secure的以确保安全。
SameSite绑定的是这个“屋子”,也就是domain;而CORS更像是一种白名单
防御CSRF的正确姿势
因为CSRF的防御措施非常多,所以正确的姿势应该在node上面开一个中间件,专门防御CSRF
防御Injection
除了SQL之外的Injection攻击
- 最小权限原则:永远不要给用户sudo或者root权限
- 建立允许名单 + 过滤危险操作
- 对URL类型参数进行协议、域名、IP等限制
防御DoS攻击
- 检查代码,不要使用贪婪模式的正则表达式
- 使用代码扫描工具 + 正则性能测试
- 永远不要使用用户提供的正则
防御DDoS攻击
- 流量治理
-
- 负载均衡
- API网关
- CDN
- 快速自动扩容
- 非核心服务降级
三、课后个人总结:
- 道高一尺魔高一丈,我想起了中国长城防火墙的建立的重大意义。安全无小事,不然后悔都来不及。
四、引用参考:
- SameSite 那些事 | 怡红院落
- Amazon.com: Web Application Security: Exploitation and Countermeasures for Modern Web Applications
如果用户的要求就是要我们动态生成DOM,那么就没有什么特别完美的方法,只能说要注意以下几个点
如果String一定要转义
如果允许上传svg,那么一定要对svg文件进行扫描。因为svg图片允许插入script标签,如果图片加载那么就会执行。
尽量不要让用户自定义跳转,如果要做那么也要做好过滤,因为自定义连接可以传递script标签
如果允许用户自定义样式那么也有可能被攻击。下面这个就是某些收入选中了就会发送请求,然后攻击者就会知道某些人的收入是怎么样的。
插播:同源策略
任何script必须是同源才会被执行,或者自己设置几个白名单
CSRF会有异常来源的请求,所以只要限制了异常来源的请求,那么就可以防御CSRF攻击
你看似点击了button,实际你是点击了叠在下面的东西
可以这么防御,http响应头部可以利用,在服务器给所有页面设置这个头部:
- 如果deny,那么就不允许页面加载iframe
- 如果是SAMEORIGIN,那么必须是同源页面才能加载iframe
一定不能为了偷懒而把get写成既能get又能post,不然攻击者既可以偷数据,还能修改用户数据
也就是限制能带上cookie发送请求的范围
如果是这种情况,服务器可以把SameSite设置为none,也就是不对SameSie做出任何限制,但是你要标明这个cookie是secure的以确保安全。
SameSite绑定的是这个“屋子”,也就是domain;而CORS更像是一种白名单
因为CSRF的防御措施非常多,所以正确的姿势应该在node上面开一个中间件,专门防御CSRF