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

132 阅读6分钟

这是我参与「第四届青训营 」笔记创作活动的的第7天,今天了解一下在web开发中需要注意和处理的安全问题。

本次我们从两个角度来看待Web安全\color{RoyalBlue}{本次我们从两个角度来看待Web安全}

  • 假如你是一个攻击者———攻击\color{RoyalBlue}{假如你是一个攻击者———攻击}
  • 假如你是一个开发者———防御\color{RoyalBlue}{假如你是一个开发者———防御}

攻击篇

1. XSS(跨站脚本攻击 Cross Site Scripting)

XSS通过主要通过将恶意代码插入至Web页面实现,当恶意代码被插入页面后用户对页面进行浏览,此时恶意代码会被执行从而达到恶意攻击的目的。

XSS的产生主要是开发者盲目信任用户提交的内容或前端工程师不将数据进行处理就直接渲染而导致的。

XSS的特点

  • 难以被直接感知
  • 可以窃取用户信息,造成用户泄露
  • 绘制UI诱骗用户主动泄露信息等操作

XSS的分类

XSS根据其攻击性质可以分为:存储型XSS攻击\color{skyblue}{存储型XSS攻击}反射型XSS攻击\color{skyblue}{反射型XSS攻击}基于DOMXSS攻击\color{skyblue}{基于DOM的XSS攻击}基于MutationXSS攻击\color{skyblue}{基于Mutation的XSS攻击}

  • 存储型XSS攻击

    • 恶意脚本会被存入数据库
    • 当用户访问页面并读取含有恶意脚本的数据时,会执行恶意脚本从而达到攻击的目的
    • 该攻击方式的危害最大,基本所有用户都可能被攻击
  • 反射型XSS攻击

    • 不涉及数据库,不进行数据库数据的读写
    • 从URL进行攻击,通过URL携带的query参数读取用户信息
  • 基于DOM的XSS攻击

    • 不需要服务器参与
    • 攻击的发起与执行均在浏览器端完成
  • 基于Mutation的XSS攻击

    • 利用浏览器渲染DOM的特性
    • 不同的浏览器攻击方式不同

CSRF(跨站请求伪造 Cross Site Request Forgery)

CSRF攻击会在用户不知情的情况下获取用户权限(cookie),通过用户权限构造指定的HTTP请求完成对用户信息的修改或窃取。
CSRF攻击具有易于创建,成本低等特点。

CSRF攻击原理

  1. 首先用户在伪造的网站中输入账号信息向真实网站发送请求。
  2. 当真实网站验证成功后返回具有用户权限的字段(cookie)。
  3. 攻击者通过虚假网站获取到真实网站返回的cookie。
  4. 在用户尚未退出登录使cookie失效时,攻击者便通过获取的cookie伪造HTTP请求向真实网站发送攻击性的代码。
  5. 之后又虚假网站会在用户不知情的情况下携带cookie对真实网站发送请求,并实现对用户信息的获取和修改。

Injection(注入攻击)

SQL注入

graph LR
A["请求<br/><br>SQL参数<br>(恶意注入)"] --> b[Server<br><br>参数 -> SQL<br><br>运行SQL参数]
b --> c[获取其他数据<br><br>修改数据<br><br>删除数据<br><br>......]

命令行注入

命令行注入通过向服务端发送恶意命令行代码,若处理不慎导致该恶意代码运行则可能导致数据库丢失、数据库数据被修改、数据库数据被窃取、服务器宕机等重大事故。

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

当服务器未对请求进行过滤从而使外部人员获取到内网权限执行只有内网人员才能执行的操作,并可能导致重要信息暴露,系统被攻击等问题。

DoS(服务拒绝攻击 Denial of Service)

通过构造特定请求使服务器的资源被显著性的损耗,导致服务器无法及时响应更多的请求,从而导致请求拥堵、挤压,进而使服务器系统停止响应或直接崩溃。

ReDoS:计入正则表达式的DoS攻击

当服务端有贪婪模式的正则匹配时,当需要匹配的字符串过长,正则匹配时会多次进行回溯行为从而延长服务器的响应时间并降低接口的吞吐量。

DDoS(分布式服务拒绝攻击 Denial of Service)

攻击者在短时间内利用大量僵尸设备对同一服务器发送请求直到服务器无法及时对所有请求进行处理,导致请求堆积,进而使服务器系统停止响应或直接崩溃。

攻击特点

  • DDos攻击直接访问服务器IP进行攻击
  • DDoS攻击不区分攻击接口
  • DDoS攻击会消耗服务端大量带宽,导致资源耗尽

中间人攻击(基于传输层进行攻击)

在攻击者与用户端分别创建一个独立的连接,交换双方数据伪造出双方正在通过一个私密连接与对方直接对话的假象。

防御篇

XSS攻击

  • 永远不要信任用户提交的内容
  • 不要将不信任的内容直接渲染为DOM
  • 若必须生成动态DOM时,应对内容进行转义
  • 如果需要用户上传svg文件,需要对文件进行扫描
  • 尽量不允许用户进行自定义跳转
  • 不允许用户自定义样式

CSRF(跨站请求伪造 Cross Site Request Forgery)

  • 限制请求来源
  • token防御
    1. 浏览器向服务器发送获取页面的请求
    2. 服务器获取请求后返回页面和token
    3. 浏览器在请求API时需要携带token
    4. 服务器对token进行校验

    注意\color{orange}{注意}

    1.\color{orange}{1.} token需要与具体的用户进行绑定\color{orange}{token需要与具体的用户进行绑定}
    2.\color{orange}{2.} token需要设定过期时间\color{orange}{token需要设定过期时间}

  • 防御ifreame攻击

    攻击者在页面插入DOM伪造一个同源请求。
    服务器端通过设定X-Frame-Options可以规避该攻击。

  • 防御CSRF反模式

    避免一个请求方法实现多种方式的请求。

  • 避免用户信息被携带

    限制cookie的domain属性和页面的域名。
    当需要内嵌依赖cookie的第三方服务时,可以使用Set-Cookie:SameSite=None;Secuer的设定。

  • 同源策略

    保证协议、域名、端口号相同。

  • CSP(内容安全策略 Content Security Policy)
    • 定义哪些源(域名)是安全的
    • 仅对安全源的脚本进行执行
    • 拒绝eval和内联script标签

Injection(注入攻击)

SQL注入

  • 最小权限原则
  • 建立白名单进行过滤
  • 对URL参数类型进行协议、域名、IP限制。

ReDoS

  • 完善代码Review工作
  • 代码扫描和正则性能测试
  • 拒绝用户定义的正则

DDoS

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

中间人攻击

使用HTTPS,HTTPS具有可靠性完整性不可抵赖性三个特点。

  • 可靠性:对数据进行加密避免明文传输
  • 完整性:使用MAC校验避免数据篡改
  • 不可抵赖性:使用数字签名确保双方身份是可信任的

SRI

对比静态资源的hash值确保资源没有被篡改。

总结

在开发中会遇到很多安全问题,大多数可能会被忽视,作为开发者我们应该多多注意各部分的安全保障,完善防御机制从而防止被不法分子有机可乘。