这是我参与「第五届青训营 」伴学笔记创作活动的第 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站播放器,识别不了用户登录态,发不了弹幕
| SameSite | CORS |
|---|---|
| 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