Web 开发安全 | 青训营笔记

113 阅读3分钟

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

网络时代中,Web 安全随处可见且危害极大!本节笔记将从安全问题中 ⌈ 攻击者 ⌋ 和 ⌈ 防御者 ⌋ 的角色出发,讲解相关的 Web 开发安全。

课堂重点🗒️🖋️

  1. Cross-Site Scripting(XSS)
  2. Cross-site request forgery(CSRF)
  3. Injection
  4. Denial of Service(DoS)
  5. Distributed DoS(DDoS)
  6. 中间人攻击
  7. XSS 的防御
  8. 防御 CSRF 的正确姿势
  9. 防御 Dos
  10. 防御 Injection 防御中间人

一、假如你是一个 hacker ——攻击

1.1 XSS

  • 通常难以从 UI 上感知(暗地执行脚本)
  • 窃取用户信息(cookie / token)
  • 绘制 UI (例如弹窗),诱骗用户点击 / 填写表单

image.png

Demo

image.png

可以直接提交恶意脚本

image.png

1.1.1 Stored XSS

  • 恶意脚本被存在数据库中
  • 访问页面 → 读数据 == 被攻击
  • 危害最大,对全部用户可见

1.1.2 Reflected XSS

  • 不涉及数据库
  • 从 URL 上攻击

1.1.3 DOM-based XSS

  • 不需要服务器的参与 – 恶意攻击的发起 + 执行,全在浏览器完成

Reflected vs DOM-based

image.png

1.1.4 Mutation-based XSS

  • 利用了浏览器渲染 DOM 的特性(独特优化)
  • 不同浏览器,会有区别(按浏览器进行攻击)

1.2 Cross-site request forgery(CSRF) ⌈ 跨站伪造请求 ⌋

  • 在用户不知情的前提下
  • 利用用户权限( cookie )
  • 构造指定 HTTP 请求,窃取或修改用户敏感信息

image.png

从上图 CSRF demo 中我们可以知道: ① 用户没有访问银行页面; ② 银行页面中的特定接口被请求; ③ 请求执行成功。

1.3 Injection ⌈ 注入 ⌋

1.3.1 SQL Injection

image.png

  • lnjection 不止于SQL *
  • CLI
  • OS command
  • Server-Side Request Forgery(SSRF),服务端伪造请求
    • 严格而言,SSRF 不是 injection ,但是原理类似

1.4 Denial of Service(Dos)

通过某种方式(构造特定请求),导致服务器资源被显著消耗,来不及响应更多请求,导致请求挤压,进而雪崩效应。

1.4.1 Distributed DoS(DDoS)

短时间内,来自大量僵尸设备的请求流量,服务器不能及时完成全部请求,导致请求堆积,进而雪崩效应,无法响应新请求。⌈ 不搞复杂的,量大就完事儿了 ⌋

1.4.2 Logical DoS

  • 耗时的同步操作
  • 数据库写入
  • SQL join
  • 文件备份
  • 循环执行逻辑

1.6 中间人攻击

传输层 demo 图

image.png

二、假如你是一个开发者————防御

2.1 XSS 的防御

XSS 的防御,需要保持两点:

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

image.png

借助现成工具防御

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

✍ 用户坚持直接把数据动态生成 DOM 😵

针对这类特殊用户,需要注意下图所示的几点:

image.png

拓展: CSRF 的防御

if 伪造请求 == 异常来源

then 限制请求来源 👉 限制伪造请求⌈ 请求头部 ⌋

  • origin – 同源请求中,GET + HEAD 不发送
  • Referer

image.png

① 用户绑定:攻击者也可以是注册用户 == 可以获取自己的token ② 过期时间:【前向保密】

结尾

综上,今天又是好好学习的一天!😊