【青训营】web开发的安全之旅

61 阅读2分钟

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

web安全一窥

安全问题是很常见的,会危害用户、公司、程序员(祭天)

从两个角度看web安全——攻击、防御

攻击篇

XSS攻击:Cross-site Scripting

没有将用户提交内容进行过滤/转义,直接转化成 DOM

XSS的一些特点:

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

xss demo

public async submit(ctx){
    const { content,id } = ctx.request.body
    await db.save({
        content,
        id,
    })
}

public async render(ctx){
    const { content } = await db.query({
        id:ctx.query.id
    })
    ctx.body = `<div>${content}</div>`
}

可以恶意提交脚本

fetch("/submit",{    body:JSON.stringify({      id:'1',      content:`<script>alert("xss")</script>`    })  })

stored XSS

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

Reflected XSS

  • 不涉及数据库

  • 从URL上攻击

    host/path/?param=

DOM-based XSS

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

Reflected与DOM-based的不同

完成注入脚本的地方不一样

mutation-based XSS

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

CSRF攻击:Cross-site request forgery

  1. 用户没有访问银行页面
  2. 银行页面中的特定接口被请求
  3. 请求执行成功

Injection

DoS:Denial of Service

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

ReDoS:基于正则表达式的DoS

贪婪模式:n次不行?n-1次再试试?——回溯

Logical DoS

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

DDoS:Distributed DoS

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

不搞复杂的,量大就完事了

  • 直接访问IP
  • 任意API
  • 消耗大量带宽