存在的恶意攻击
XSS
XSS 代表跨站点脚本,它是注入类型的攻击。
跨站点脚本是攻击者将恶意脚本注入受信任网站的方法。
存储型XSS
如图,攻击者访问网站并找到未受保护的输入字段,并输入恶意脚本而不是预期值。之后,每当该值显示给其他用户时,它都会执行恶意代码。
反射型XSS
预期 URL:https://example.com/search?q=javascript
恶意 URL:https://example.com/search?q=<script>alert(1)</script>
攻击者诱使用户点击此类恶意 URL,用户点击后会执行恶意代码。
DOM型XSS
预期 URL:https://example.com/search?q=javascript
恶意 URL:https://example.com/search#q=<script>alert(1)</script>
DOM 型 XSS 与反射型 XSS 相同,区别在于使用了 # 字符。
浏览器不会向服务器发送 # 后面的 URL 部分,它会直接将其传递给客户端代码。
处理方法
字符串验证:定义一组规则,并要求不受信任的数据满足这些规则后方可继续的方法
字符串转义:浏览字符串并查找特殊字符,如
< >
,然后用适当的 HTML 字符名称替换它们
function escapeText(text) {
return text.replace(/&/g, '&')
.replace(/</g, '<')
.replace(/>/g, '>')
.replace(/"/g, '"')
}
- 字符串清理:当允许用户在评论中输入一些 HTML 标签时,遍历文本查找指定的 HTML 标记并将其删除。但此方法资源昂贵,因此要慎重使用
CSP
内容安全策略 CSP 是一种 Web 安全策略,通过定义哪些资源可以加载到网页中以及如何执行内联脚本来实现,可以有效减少 XSS 的攻击面。
严格的 CSP 具有以下结构,并通过设置 HTTP 响应标头来启用。
- 基于随机数的严格 CSP
Content-Security-Policy:
script-src 'nonce-{RANDOM}' 'strict-dynamic';
object-src 'none';
base-uri 'none';
- 基于 Hash 的严格 CSP
Content-Security-Policy:
script-src 'sha256-{HASHED_INLINE_SCRIPT}' 'strict-dynamic';
object-src 'none';
base-uri 'none';
CSRF
跨站请求伪造 CSRF 是一种攻击类型,在用户已通过身份验证的其它可信网站上执行不必要的操作时,就会发生这种攻击。
target-site.com
网站允许用户通过访问特定的 URL 来转账资金。
https://target-site.com/transfer?to=attacker&amount=1000
攻击者创建一个精心构造的网页
<!DOCTYPE html>
<html>
<head>
<title>恶意网页</title>
</head>
<body>
<h1>点击以下链接获取免费礼品卡:</h1>
<img src="https://target-site.com/transfer?to=attacker&amount=1000" alt="礼品卡链接">
</body>
</html>
如图,攻击者将这个恶意网页伪装成诱人的内容,然后诱使用户点击该链接 malicious-site.com
。受害者在已经登陆 target-site.com
网站的情况下点击了这个链接。浏览器发送这个请求,由于用户已经通过网站的会话认证,这将导致1000单位的资金被转移到攻击者的账户中。
处理方法
- CSRF token:为每个用户生成唯一的 CSRF token,并将其与用户的会话相关联。在执行敏感操作之前,服务器会验证请求中的 token,以确保请求是合法的。
- 同源策略:使用同源策略限制外部网站对受保护网站的访问
- HTTP Referer:检查 HTTP Referer,以确保请求来自合法的来源
参考文章
https://dev.to/maleta/cors-xss-and-csrf-with-examples-in-10-minutes-35k3