# Web开发的安全之旅(防御篇)|青训营笔记

102 阅读2分钟

Web开发的安全之旅(防御篇)|青训营笔记

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

Web安全一窥

安全问题“很常见”,会危害用户、公司、程序员。

下面将从攻击与防御两个角度看Web安全,本文为防御篇。

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

XSS

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

现成工具

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

Content Security Policy(CSP)

内容安全策略。

  • 哪些源(域名)被认为是安全的
  • 来自安全源的脚本可以执行,否则直接抛错
  • eval + inline script说“no”

CSRF

if 伪造请求\equiv异常请求

then 限制请求来源\rightarrow限制伪造请求

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

token

token.png

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

iframe攻击

  • X-Frame-Options: DENY/SAMEORIGIN

anti-pattern

GET !== GET + POST

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

限制:

  • Cookie domain
  • 页面域名

SameSite vs CORS

SameSiteCORS
Cookie发送资源读写(HTTP请求)
domain vs 页面域名资源域名 vs 页面域名
“我跟你说个事儿,出这屋我可就不认了”白名单

正确姿势

使用中间件生成各种防御策略,而不是case by case。

Injection

SQL

  • 找到项目中查询SQL的地方
  • 使用prepared statement

beyond SQL

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

Regex DoS

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

DDoS

  • 流量治理
    • 负载均衡
    • API网关
    • CDN
  • 快速自动扩容
  • 非核心服务降级

传输层

防御中间人

使用HTTPS。

HTTPS的一些特性:

  • 可靠性:加密(身份)
  • 完整性:MAC验证(篡改)
  • 不可抵赖性:数字签名(身份)

HTTP Strict-Transport-Security(HSTS):将HTTP主动升级为HTTPS。需要先有一次HTTPS访问。

Subresourse Intergrity(SRI)

通过对比hash,防止静态资源(CDN)被劫持篡改。

FeaturePolicy/Permission Policy

限制一个源(页面)下,可以使用哪些功能:camera、microphone、autoplay……在被XSS攻击后限制页面功能。

尾声

  • 安全无小事
  • 使用的依赖(npm package,甚至事NodeJS)可能成为最薄弱的一环。
  • 保持学习心态