CSRF 和 XSS 攻击分析与防范
CSRF (跨站请求伪造)
什么是 CSRF?
CSRF (Cross-Site Request Forgery) 是一种攻击方式,攻击者诱使用户在已登录目标网站的情况下,执行非预期的操作。
攻击流程:
- 用户登录可信网站 A
- 在不登出 A 的情况下访问恶意网站 B
- B 诱导用户点击链接或加载资源,向 A 发起请求
- A 的服务器认为这是用户的合法请求,执行操作
CSRF 防范措施
1. 使用 CSRF Token
# Django 示例
from django.middleware.csrf import get_token
def some_view(request):
csrf_token = get_token(request)
# 将 token 放入表单
return render(request, 'template.html', {'csrf_token': csrf_token})
# 在表单中
<form method="post">
{% csrf_token %}
<!-- 其他表单字段 -->
</form>
2. SameSite Cookie 属性
// 设置 SameSite 属性
Set-Cookie: sessionid=xxxxxx; SameSite=Strict; Secure; HttpOnly
Strict
: 完全禁止第三方 CookieLax
: 宽松模式,允许部分安全请求携带 Cookie
3. 检查 Referer/Origin 头部
# Flask 示例
from flask import request
@app.before_request
def check_referer():
if request.method == "POST":
referer = request.headers.get("Referer")
origin = request.headers.get("Origin")
if not (referer and referer.startswith("https://yourdomain.com")) and \
not (origin and origin == "https://yourdomain.com"):
abort(403)
XSS (跨站脚本攻击)
什么是 XSS?
XSS (Cross-Site Scripting) 是攻击者向网页注入恶意脚本,当其他用户访问时执行的攻击方式。
三种类型:
- 存储型 XSS:恶意脚本存储在服务器上
- 反射型 XSS:恶意脚本作为请求的一部分返回
- DOM 型 XSS:完全在客户端执行的攻击
XSS 防范措施
1. 输入输出转义
// 转义 HTML
function escapeHtml(text) {
const div = document.createElement('div');
div.textContent = text;
return div.innerHTML;
}
// 转义属性
function escapeAttr(value) {
return value.replace(/"/g, '"')
.replace(/'/g, ''')
.replace(/</g, '<')
.replace(/>/g, '>');
}
2. 使用 CSP (内容安全策略)
Content-Security-Policy:
default-src 'self';
script-src 'self' https://trusted.cdn.com;
img-src 'self' data:;
style-src 'self' 'unsafe-inline';
object-src 'none';
3. 设置 HttpOnly 和 Secure Cookie
Set-Cookie: session=xxxxxx; HttpOnly; Secure; SameSite=Strict
HttpOnly
: 防止 JavaScript 访问 CookieSecure
: 仅通过 HTTPS 传输
4. 使用现代框架的安全特性
// React 自动转义
const userInput = "<script>alert('xss')</script>";
return <div>{userInput}</div>; // 安全,会被转义
// Vue 自动转义
<template>
<div>{{ userInput }}</div> <!-- 安全,会被转义 -->
</template>
综合防御建议
- 最小权限原则:所有资源请求使用最小必要权限
- 定期更新:保持框架和库的最新版本
- 自动化测试:使用安全扫描工具如 OWASP ZAP
- 安全编码培训:提高团队安全意识
通过组合使用这些技术,可以显著降低 CSRF 和 XSS 攻击的风险。