Web 开发的安全之旅 | 青训营笔记

46 阅读3分钟

两个角度看 Web 安全

攻击

XSS

Cross-Site Scripting(XSS):跨站脚本攻击。

攻击者通过某种方式,将自己的恶意脚本插入到网页中。

XSS 能够成功的原因:

  1. 开发者盲目信任用户的提交内容

  2. 开发者将用户输入的字符串转化为 DOM

    • document.write
    • element.innerHTML = anyString
    • SSR(user_data):伪代码

XSS 的特点:

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

分类:

  1. Stored XSS(存储型的 XSS)

    • 恶意脚本被存在数据库中
    • 访问页面 -> 读数据 === 被攻击
    • 危害最大,对全部用户可见
  2. Reflected XSS(反射性 XSS)

    • 不涉及数据库
    • 从 URL 上攻击
    • 从服务器上注入
  3. DOM-based XSS(基于 DOM 的 XSS)

    • 不需要服务器的参与
    • 恶意攻击的发起 + 执行,全在浏览器完成
  4. Mutation-based XSS(基于 DOM 渲染的 XSS)

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

CSRF

Cross-site request forgery(CSRF):跨站伪造请求。

向服务器发起伪造请求。

常用:iframe

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

Injection

Injection:注入请求。

向请求中注入某些数据。

例如:SQL Injection 就是向请求中注入 SQL 参数,恶意修改数据库。

分类:

  1. SQL

  2. CLI

  3. OS command

  4. Server-Side Request Forgery(SSRF):服务端伪造请求

    严格来说,SSRF 不是 Injection,但是原理类似

DoS

Denial of Service(DoS):拒绝服务。

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

DDoS

Distributed Dos(DDoS):大量拒绝服务。

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

传输层——中间人攻击

image-20230807152259319.png

防御

XSS

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

现成工具

前端:

  • 主流框架默认防御 XSS

    例如:Vue、React

  • google-closure-library

服务端(Node):

  • DOMPurify

CSP

Content Security Policy(CSP):内容安全策略。

  • 允许开发者定义哪些源(域名)被认为是安全的
  • 来自安全源的脚本可以执行,否则直接抛错
  • 对 eval + inline script 说 no
 <!-- 浏览器中设置 -->
 <meta http-equiv="Content-Security-Policy" content"script-src self>

CSRF

核心:限制伪造请求。

  • 请求头部

    • Origin

      同源请求中,GET + HEAD 不发送

    • Referer

  • token

image-20230807154736981.png

  • 防御 iframe 标签

    服务器端设置响应头 X-Frame-Options: DENY / SAMEORIGIN

    • DENY:当前页面不能被做为 iframe 进行加载
    • SAMEORIGIN:同源页面才能加载 iframe
  • SameSite Cookie(避免用户信息被携带)

image-20230807155634934.png

| SameSite       | CORS          |
| -------------- | ------------- |
| Cookie 发送      | 资源读写(HTTP 请求) |
| domain vs 页面域名 | 资源域名 vs 页面域名  |
| Cookie domain  | 白名单           |

防御 CSRF 的正确姿势

创建中间件 middlewares,这个中间件就专门用于生成各种防御 CSRF 的策略。

SQL Injection

  • 最小权限原则

    • sudo || root
  • 建立允许名单 + 过滤

    • rm
  • 对 URL 类型参数进行协议、域名、ip 等限制

    • 访问内网

DoS

  • 代码扫描 + 正则性能测试

DDoS

  • 过滤

    • 流量治理

      • 负载均衡
      • API 网关
  • 抗量

    • 流量治理

      • CDN
    • 快速自动扩容

    • 非核心服务降级

传输层——防御中间人

  • HTTPS

SRI

Subresource Integrity(SRI):子资源完整性。

防止静态资源被劫持篡改:对比 hash。