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

104 阅读3分钟

这是我参与「第四届青训营」笔记创作活动的的第7天

本堂课重点内容

  • Web 安全

详细知识点介绍

两个角度看 Web 安全

攻击

  • Cross-Site Scripting(XSS)

    XSS 主要利用了 开发者盲目信任用户的提交内容

    • XSS 的一些特点

      • 通常难以从 UI 上感知(暗地执行脚本)

      • 窃取用户信息(cookie/token)

      • 绘制 UI(例如弹窗),诱骗用户点击/填写表单

    Stored XSS

    • 恶意脚本被存在数据库中

    • 访问页面 -> 读数据 == 被攻击

    • 危害最大,对全部用户可见

    Reflected XSS

    • 不涉及数据库

    • 从 URL 上攻击

    DOM-based XSS

    • 不需要服务器的参与

    • 恶意攻击的发起 + 执行,全在浏览器完成

    Mutation-based XSS

    • 利用了浏览器渲染 DOM 的特性(独特优化)

    • 不同浏览器,会有区别(按浏览器进行攻击)

  • Cross-site request forgery(CSRF)

    • 在用户不知情的前提下

    • 利用用户权限(如cookie)

    • 构造指定 HTTP 请求,窃取或修改用户敏感信息

  • Injection

    SQL injection

    • 请求:SQL 参数(恶意注入)

    • Server:参数 -> SQL 运行 SQL code

    • 获取其他数据,修改数据,删除数据...

    CLI

    OS command

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

    • 严格而言,SSRF 不是 injection ,但是原理类似
  • Denial of Service(Dos)

    ReDos:基于正则表达式的 Dos

    Distributed DoS(DDos)

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

    攻击特点

    • 直接访问 IP

    • 任意 API

    • 消耗大量带宽(耗尽)

  • 传输层

    中间人攻击

    • 明文传输

    • 信息篡改不可知

    • 对方身份未验证

防御

永远不信任用户的提交内容

  • 不要将用户提交内容直接转换成 DOM

现成工具

  • 前端

    • 主流框架默认防御 XSS

    • google-closure-library

  • 服务端(Node)

    • DOMPurify

其他

  • String -> DOM 注意对 String 进行转义

  • 对于用户上传 svg 的文件,要对其进行扫描

  • 尽量不允许用户自定义跳转链接,同时要对其进行过滤

  • 额外留意自定义样式

  • Same-origin Policy

  • Content Security Policy(CSP)

    • 哪些源(域名)被认为是安全的

    • 来自安全源的脚本可以执行,否则直接抛错

    • 对 eval + inline script 说 NO

  • CSRF 的防御

    • if 伪造请求 == 异常来源

    • then 限制请求来源 -> 限制伪造请求

    • origin

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

    • token

      • 请求页面

      • 页面+token

      • 请求 API + token

      • 验证 token + 数据

      • token 必须与具体用户绑定

      • token 需要有过期时间

    • SameSite Cookie:避免用户信息被携带

  • Injection 的防御

    • 找到项目中查询 SQL 的地方

    • 使用 prepared statement

    • 最小权限原则

    • 建立允许名单 + 过滤

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

  • Dos 的防御

    • Regex Dos

      • Code Review

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

      • 拒绝使用用户提供的使用正则

    • DDoS

      • 流量治理

        • 负载均衡

        • API 网关

        • CDN

      • 快速自动扩容

      • 非核心服务降级

  • 防御中间人

    HTTPS

    • 可靠性:加密

    • 完整性:MAC 验证

    • 不可抵赖性:数字签名

    HTTP Strict-Transport-Security(HSTS)

    Subresource Integrity(SRI)

总结

  • 安全无小事

  • 使用 的依赖(npm package,甚至是 NodeJS)可能成为最薄弱的一环

    • left-pad 事件

    • eslint-scope 事件

    • event-stream 事件

  • 保持学习心态

课后个人总结

今天我们作为攻击者,学习了五种攻击方式,然后以防御者的身份思考如何避免掉这些攻击。正如老师所说,安全无小事,知己知彼百战百胜,由于目前我还在打基础的阶段,也没取得什么成就,实在谈不上经验分享。

引用参考

第四届字节跳动青训营「web 开发的安全之旅 」课程