14 Web 开发安全 - 防御篇|青训营笔记

43 阅读5分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 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
  • 快速自动扩容
  • 非核心服务降级

三、课后个人总结:

  1. 道高一尺魔高一丈,我想起了中国长城防火墙的建立的重大意义。安全无小事,不然后悔都来不及。

四、引用参考:

  1. SameSite 那些事 | 怡红院落
  2. 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

  1. SameSite 那些事 | 怡红院落
  2. Amazon.com: Web Application Security: Exploitation and Countermeasures for Modern Web Applications