零壹陆——Web开发安全:防御篇 | 青训营录课笔记

85 阅读3分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 15 天

XSS 的防御

永远不要信任用户的提交内容
不要将用户提交内容直接转换成DOM

XSS —— 现成工具

  • 前端
    • 主流框架默认防御 XSS
    • google-closure-library
  • 服务端
    • DOMPurify

警惕

⚠️⚠️string → DOM
 要进行转译
⚠️⚠️上传 svg
 对svg文件进行一次扫描
 svg图片中可以插入script标签,如果svg图片被加载,script标签会被执行,完成一次XSS攻击
⚠️⚠️Blob 动态生成 script
 尽量不要做让用户自定义跳转的行为,如果要做,请做好过滤。
 如果允许自定义跳转链接,可以传递js代码


内容安全策略(CSP)

  • 允许开发者定义哪些源(域名)被认为是安全的
  • 来自安全源的脚本可以执行,否则直接抛错
  • 对 eval + inline script 说 🚫🚫

服务器的响应头部

Content-Security-Policy: script-src 'self'  同源
Content-Security-Policy: script-src 'self' https://domain.com

浏览器meta

<meta http-equiv="Content-Security-Policy" content="script-src self">

CSRF 的防御

伪造请求来源是异常来源,限制请求来源可以限制 CSRF 攻击
作为服务器端开发人员,可以针对接口请求,对Origin或Referer进行校验,若Origin或Referer是自己的
域名,便放行此请求,若不是,便拒绝这个请求。
  • if 伪造请求 === 异常来源
  • then 限制请求来源 → 限制伪造请求
  • Origin
    • 同源请求中,GET + HEAD 不发送
  • Referer(更广泛的被利用)、

CSRF —— token

如果一个请求来自于一个合法页面(服务器接受过相关页面的请求),服务器在接收这个页面请求时,可以进行一些标记

🤔 除了 Origin + Referer
其他判断【请求来自于合法来源】的方式
if(请求来自合法页面)
then(服务器接受过页面请求)
then(服务器可以标识)
先有页面,后有请求

CSRF —— iframe 攻击

攻击者构造一个页面,页面上有一个<button>标签,<button>下盖着一个 iframe(我们的合法页面),用户点击<button>,点击行为被穿越到 iframe 中,iframe 之中可能因受到点击而发出一个http请求,因为 iframe 中发生的请求不是跨域请求,是同源请求,所以对应的攻击完成了。


防御 CSRF 的正确姿势

从 node 的角度讲,做一个中间件,这个中间件专门生成防御 CSRF 的策略,就在一处保证整个 Web app 对 CSRF 的防御。


防御 Injection

  • 找到项目中查询 SQL 的地方
  • 使用 prepared statement
PREPARE q FROM 'SELECT user FROM users WHERE gender  = ?';
SET @gender = 'female';
EXECUTE q USING @gender;
DEALLOCATE PREPARE q;

Injection beyond SQL

  • 最小权限
    • sudo || root
  • 建立允许名单 + 过滤
    • rm
  • 对 URL 类型 参数进行协议、域名、ip 等限制
    • 访问内网

防御 DoS

Regex Dos

  • Code Review (❌ / (ab*) + /)
  • 代码扫描 + 正则性能测试
  • ❌ 用户提供的使用正则

DDos

  • 流量治理
    • 负载均衡  ⬅️过滤
    • API 网关   ⬅️过滤
    • CDN    ⬅️抗量
在【负载均衡\API 网关】进行一些流量的识别,将恶意攻击进行过滤(转到其他服务、直接拒绝)
前置 CDN,所有流量都要过 CDN,再到具体的服务 
  • 快速自动扩容  ⬅️抗量
  • 非核心服务降级 ⬅️抗量

传输层 —— 防御中间人

HTTPS 的一些特性

  • 可靠性:加密
    • 避免了明文传输
  • 完整性:MAC 验证
    • 确保信息没有被篡改
  • 不可抵赖性:数字签名
    • 确保双方身份可被信任

银烛秋光冷画屏,轻罗小扇扑流萤。