Web安全(二) | 青训营笔记

61 阅读2分钟

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

防御

XSS

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

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

前端

主流框架默认防御XSS

google-closure-library

服务端(Node)

DOMPurify

用户需求:必须动态生成DOM

string->DOM
new DOMParser();
上传svg
<svg>
    <script>alert("xss");</script>
</svg>
Blob动态生成script
const blob = new Blob(
    [script],
    {type:"text/javascript"},
);
const url = new URL.createObjectURL(blob);
const script = document.createElement("script");
script.src = url;
自定义跳转链接
<a href = "javascript:alert('xss')"></a>

Same-origin Policy

协议

域名

端口

Content Security Policy(CSP)

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

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

对eval+inline script说no

服务器的响应头部
Content-Security-Policy: script-src 'self'
Content-Security-Policy: script-src 'self' https://domain.com
浏览器meta
<meta http-equiv="Content-Security-Policy" content = "script-src self">

CSRF的防御

if伪造请求=一场来源

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

Origin

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

Referer

CSRF-token

除了Origin+Referrer

其他判断请求来自于合法来源的方式

1.if(请求来自合法页面)

2.then(服务器接收过页面请求)

3.then(服务器可以标识)

先有页面,后有请求

①用户绑定:攻击者也可以是注册用户=可以获取自己的token

②过期时间:前向保密

#####CSRF-iframe攻击

限制Origin->同源请求

CSRF anti-pattern

GET!==GET+POST

//将 更新+获取 逻辑放到同一个GET接口
public async getAndUpdate(ctx) {
    const {update,id} = ctx.query;
    if(update) {
        await this.update(update);
    }
    ctx.body = await this.get(id);
}

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

if

CSRF利用用户权限 && Cookie 用户权限

then

no cookie<->no problem<->我的Cookie只能为我所用

域名A内,

1.domain是A

-第一方Cookie

------->🆗

2.domain不是A

-第三方Cookie

------->❌

限制的是

1.Cookie domain

2.页面域名

Q:依赖Cookie的第三方服务怎么办?

A:内嵌一个X站播放器,识别不了用户登录态,发不了弹幕

SameSiteCORS
Cookie发送资源读写(HTTP请求)
domain vs 页面域名资源域名 vs 页面域名

首次导航的限制:避免敏感操作跳过二次确认,例如重置密码的链接

Injection beyond SQL

1.最小权限原则

-sudo || root

2.建立允许名单+过滤

-rm

3.对URL类型参数进行协议,域名,ip等限制

-访问内网

防御DoS

Regex DoS

1.Code Review(❌/(ab*)+/)

2.代码扫描+正则性能测试

3.❌用户提供的使用正则

Logical DoS

1.不是非黑即白

-有些case,只有在请求量大到一定之后,才会体现

2.分析代码中的性能瓶颈

-同步调用

-串行逻辑

-CPU密集型操作

3.限流

DDoS

  • 流量治理

    • 负载均衡
    • API网关
    • CDN
  • 快速自动扩容

  • 非核心服务降级

HTTPS的一些特性

  • 可靠性:加密

  • 完整性:MAC验证

    传输内容

    加密信息+加密信息_hash
    

    接收方

    if (hash(加密信息) === 加密信息_hash) {
        ok
    } else {
        not ok
    }
    
  • 不可抵赖性:数字签名

HTTP Strict-Transport-Security(HSTS)

将HTTP主动升级到HTTPS