Web安全-防御

52 阅读3分钟

防御

对XSS的防御

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

前端现成工具:-主流框架默防御XSS; -google-closure-library

服端(Node):DOMPurify

如果需要动态生成DOM:

1)string->DOM:即new DOMParser();时 ,需要对string进行转译

2)上传svg:需要对svg进行扫描检查,不允许插入script标签

<svg>
<script>alert("xss");</script>
</svg>

3)尽量不要做让用户自定义跳转的行为,如果做一定要做好过滤,因为可能会传递js代码。Blob 动态生成script

const blob = new Blob{
	[script],
	[ type: "text/javascript"],
};
const url = new URL.createObjectURL(blob); 
const script = document.createElement("script"); 
script.src = url;

4)自定义样式

防御自定义样式攻击.jpg

CSP内容安全策略

Content Security Policy(CSP):

-哪些源(域名)被为是安全的 -来自安全源的脚本可以执行,否则直接抛错 -対 eval + inline script直接拒绝

CSP举例:只允许同源的和domain.com地址访问

CSP举例.jpg

对CSRF的防御

限制请求来源

CSRF防御.jpg 检查Origin和Referer,如果是服务器端的域名放行,反之拒绝。同源请求中,GET+HEAD不发送Origin字段。

token

CSRF-token.jpg

CSRF-token解决:token必须和具体用户进行绑定,且有过期时间

CSRF-token解决.jpg

CSRF-ifrane攻击解决方案

CSRF-ifrane攻击.jpg

按钮下边盖着iframe(合法页面),按钮点击事件因为css而穿越到了iframe下触发了点击,点击按钮也就让iframe中发出了同源请求。

可以设置响应头部X-Frame-Options: DENY/SAMEORIGIN(当前页面不能加载iframe/是同源页面才能加载iframe)来防御。

避免用户携带SameSite Cookie

也就是说我的页面的Cookie只能我的页面使用,别的页面不能访问的到

SameSite Cookie.jpg

如果第三方的必须使用到cookie,比如发送弹幕需要用到用户当前登录状态;服务器可以先把SameSite设置网None。Set-Cookie: SameSite=None; Secure; 即SameSite=None表示该Cookie可以让第三方携带。

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

对Injection的防御

对SQL注入的防御

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

其他防御操作

1)-最小权限原则 : -sudo || root

2)-建立允许名单+过滤 : -rm 3)-对URL类型参数进行协议、域名、ip等限制 : -访问内网

对DoS的防御

ReDoS的防御

-Code Review (X /(ab*)+/) :避免使用正则的贪婪匹配模式 -代码扫描 + 正则性能测试

-拒绝使用用户提供的正则

DDoS的防御

DDoS防御.jpg

对中间人攻击的防御

对中间人的防御.jpg

HTTPS的特性:

-可靠性:加密 (采用对称加密和非对称加密) -完整性:MAC验证。

如何确保HTTPS在传输过程中的完整性,图如下:

HTTPS完整性.jpg

-不可抵赖性:数字签名

数字签名的执行者有自己的私钥privatekey和公钥sessionkey ,执行者可以对内容用私钥进行加密,双方可以用公钥进行解密。

数字签名过程:

数字签名.jpg

服务提供方提供的一些元信息,和公钥一起合并成的信息,使用CA提供的私钥进行签名,形成真正的服务器端的证书,然后将证书传递给浏览器,浏览器会用CA的公钥对证书进行校验,判断证书签发者是否可信。

浏览器会内置大量CA签发的证书,证书里会包含公钥。

HTTPS加密过程:

HTTPS加密过程.jpg

HTTP Strict-Transport-Security(HSTS)

HSTS.jpg

SRI

如果CDN资源托管平台CDN被攻陷,放在CDN上的静态资源被劫持,可以使用SRI。SRI就是 对比标签 hash(原始内容 hash) 和 实际内容 hash