文章目录
防重放攻击
在Web应用中,重放攻击(Replay Attack) 是指攻击者截获用户的有效请求后,重新发送该请求以伪造操作(如重复支付、越权访问等)。以下是防御重放攻击的常用方法及原理分析:
1. Token机制(一次性令牌)
- 原理:
- 服务器生成唯一Token(如UUID),返回给客户端。
- 客户端需在后续请求中携带该Token。
- 服务器验证Token有效性后立即失效(如删除或标记为已使用)。
- 实现:
// 登录后返回Token HTTP/1.1 200 OK Set-Cookie: csrf_token=abc123; HttpOnly; Secure // 请求需携带Token POST /transfer HTTP/1.1 Cookie: csrf_token=abc123
- 适用场景:表单提交、敏感操作(如转账)。
2. 时间戳 + 超时验证
- 原理:
- 客户端在请求中添加当前时间戳(如
timestamp=1679800000
)。 - 服务器检查时间戳是否在合理范围内(如 ±5分钟内)。
- 客户端在请求中添加当前时间戳(如
- 增强方案:结合Token使用,避免攻击者篡改时间戳。
- 代码示例:
// 服务端验证逻辑 long requestTime = request.getParameter("timestamp"); long serverTime = System.currentTimeMillis() / 1000; if (Math.abs(serverTime - requestTime) > 300) { // 5分钟容忍窗口 throw new SecurityException("请求已过期"); }
3. Nonce(一次性随机数)
- 原理:
- 客户端生成唯一随机数(Nonce),随请求发送。
- 服务器记录已使用的Nonce,拒绝重复值。
- 优势:无需服务器生成Token,适合分布式系统。
- 注意:需结合签名(如HMAC)防止Nonce被篡改。
4. 请求签名(如HMAC)
- 原理:
- 客户端使用密钥对请求参数签名(如
sign=HMAC(params + timestamp, key)
)。 - 服务器验证签名有效性及时间戳。
- 客户端使用密钥对请求参数签名(如
- 适用场景:API接口、无状态服务。
- 示例:
# 客户端生成签名 import hmac params = "amount=100×tamp=1679800000" sign = hmac.new(b"secret_key", params.encode(), "sha256").hexdigest() # 服务端验证 expected_sign = hmac.new(b"secret_key", params.encode(), "sha256").hexdigest() if request.sign != expected_sign: return "签名无效"
5. HTTPS + 安全Cookie
- 作用:
- HTTPS加密传输内容,防止请求被截获。
- 设置Cookie的
Secure
、HttpOnly
、SameSite
属性,限制跨站请求。
- 配置示例:
# Nginx配置HTTPS ssl_certificate /path/to/cert.pem; ssl_certificate_key /path/to/key.pem; # Cookie安全属性 Set-Cookie: session_id=xyz; Secure; HttpOnly; SameSite=Strict
6. 幂等性设计
- 原理:
- 对关键操作(如支付)设计幂等接口,即使重复请求结果也一致。
- 通过唯一交易号(
idempotency_key
)去重。
- 实现:
POST /payment HTTP/1.1 Idempotency-Key: req_12345
综合防御策略建议
- 敏感操作:使用Token + 时间戳 + 签名。
- API接口:Nonce + HMAC签名 + HTTPS。
- Web表单:CSRF Token + HTTPS。
- 支付场景:幂等性设计 + 双重验证(如短信验证码)。
注意事项
- Token存储:避免将Token存储在本地存储(易被XSS攻击获取),优先使用Cookie的
HttpOnly
属性。 - 时钟同步:时间戳方案需考虑客户端与服务端时间偏差(如NTP同步)。
- 密钥管理:签名密钥需安全存储,避免泄露。
通过组合上述方法,可有效防御重放攻击,具体方案需根据业务场景和安全需求权衡。
XSS攻击以及防范
XSS攻击原理及防范方法详解
一、XSS攻击原理
XSS(Cross-Site Scripting)攻击的核心原理是:攻击者向网页中注入恶意脚本,当其他用户访问该页面时,浏览器会执行这些脚本。根据注入方式可分为三类:
存储型XSS
- 恶意脚本被持久化存储在服务器端(如数据库、评论系统)。
- 用户访问页面时,脚本从服务器加载并执行。
- 示例:攻击者在论坛发帖时插入
<script>alert('XSS')</script>
,所有查看该帖的用户都会触发弹窗。
反射型XSS
- 恶意脚本通过URL参数传入,服务器未经处理直接反射回页面。
- 示例:访问
http://example.com?search=<script>恶意代码</script>
,页面直接渲染攻击脚本。
DOM型XSS
- 攻击脚本通过修改页面DOM结构直接执行,无需经过服务器。
- 示例:页面JS动态拼接用户输入内容到HTML,如
document.write(location.hash)
。
二、XSS攻击的危害
- 盗取用户Cookie、Session信息。
- 劫持用户账号、执行虚假交易。
- 钓鱼攻击、传播恶意软件。
三、常见防范方法
1. 输入验证与过滤
- 原则:不信任任何用户输入,包括URL参数、表单提交等。
- 方法:
- 使用白名单机制(如只允许字母、数字)。
- 过滤或转义特殊字符(如
<
,>
,&
→<
,>
,&
)。 - 工具:HTML Purifier(PHP)、DOMPurify(JavaScript)。
2. 输出编码
- 根据输出位置选择编码方式:
- HTML内容:转义
<
,>
,&
。 - JavaScript代码:使用
JSON.stringify()
或专用库(如js-xss
)。 - URL参数:使用
encodeURIComponent()
。
- HTML内容:转义
- 示例:
// 安全输出到HTML const userInput = "<script>alert('XSS')</script>"; element.innerHTML = userInput.replace(/</g, '<').replace(/>/g, '>'); // 安全输出到JavaScript const data = { content: userInput }; const safeJSON = JSON.stringify(data).replace(/</g, '\\x3c');
3. 内容安全策略(CSP)
- 原理:通过HTTP头限制页面可执行的脚本来源。
- 配置示例:
Content-Security-Policy: default-src 'self'; script-src 'self' https://trusted.cdn.com; object-src 'none';
- 禁止内联脚本(
<script>...</script>
)。 - 仅允许指定域名的外部脚本。
- 禁止内联脚本(
4. 安全Cookie属性
- 设置
HttpOnly
:禁止JavaScript通过document.cookie
访问Cookie。 - 设置
Secure
:仅通过HTTPS传输Cookie。 - 设置
SameSite
:防止跨站请求伪造(CSRF)。
5. 避免危险API
- 禁用
innerHTML
、outerHTML
、document.write()
。 - 改用
textContent
或innerText
插入用户内容。 - React/Vue:默认自动转义,避免使用
dangerouslySetInnerHTML
。
6. 其他防御措施
- 自动转义库:使用模板引擎(如Handlebars、Jinja2)自动转义变量。
- 子域名隔离:将用户内容存储在独立子域名,避免Cookie共享。
- 定期审计:使用工具扫描XSS漏洞(如OWASP ZAP)。
四、防御示例
用户评论系统:
- 输入时过滤
<script>
、on*
事件属性。 - 输出时使用HTML转义。
- 启用CSP禁止内联脚本。
- 输入时过滤
动态内容加载:
// 危险:直接拼接HTML document.getElementById('output').innerHTML = userContent; // 安全:使用DOM操作 const div = document.createElement('div'); div.textContent = userContent; document.body.appendChild(div);
五、总结
XSS攻击的本质是利用浏览器的信任机制执行恶意代码。防御需从输入过滤、输出编码、策略限制三方面入手,结合CSP、安全编程实践和现代框架特性,构建多层防御体系。
SQL注入攻击以及防范
SQL注入攻击原理及Java Web防御详解
一、SQL注入攻击原理
攻击者通过构造特殊输入参数,破坏原有SQL语句结构,执行恶意SQL代码。典型场景:
-- 正常查询
SELECT * FROM users WHERE id = 123;
-- 攻击者输入:123 OR 1=1
SELECT * FROM users WHERE id = 123 OR 1=1; -- 返回全部用户数据
二、Java Web防御核心措施
1. 参数化查询(PreparedStatement)
原理:预编译SQL模板,用户输入作为参数绑定,杜绝拼接注入。
// 正确示例:使用PreparedStatement
String userInput = request.getParameter("id");
String sql = "SELECT * FROM users WHERE id = ?"; // 使用占位符?
try (PreparedStatement pstmt = conn.prepareStatement(sql)) {
pstmt.setString(1, userInput); // 安全设置参数
try (ResultSet rs = pstmt.executeQuery()) {
// 处理结果集
}
}
关键点:
?
占位符确保输入被当作数据而非代码。- 自动处理特殊字符转义(如
'
→''
)。
2. 输入验证与过滤
原则:拒绝非法格式,接受已知安全格式。
// 示例:验证数字型ID
String userInput = request.getParameter("id");
if (!userInput.matches("\\d+")) { // 仅允许数字
throw new IllegalArgumentException("Invalid ID format");
}
// 使用工具库(如Apache Commons Validator)
if (!NumericValidator.isInRange(userInput, 1, Integer.MAX_VALUE)) {
// 处理非法输入
}
扩展验证:
- 邮箱:
^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}$
- 手机号:
^1[3-9]\\d{9}$
3. 最小权限原则
- 数据库账户仅授予必要权限:
- 查询账户:仅
SELECT
权限。 - 避免使用
root
或sa
账户。
- 查询账户:仅
4. 安全错误处理
禁止泄露敏感信息:
try {
// 执行数据库操作
} catch (SQLException e) {
// 错误日志记录(非生产环境可关闭)
logger.error("Database error occurred", e);
// 返回通用错误信息
response.sendError(500, "System error occurred");
// 避免:response.getWriter().println("Error: " + e.getMessage());
}
5. 使用ORM框架
- Hibernate/MyBatis 自动参数化:
// Hibernate示例 User user = session.get(User.class, userId); // 自动防注入
6. Web应用防火墙(WAF)
- 部署如ModSecurity,拦截常见攻击模式:
- 检测
UNION SELECT
、SLEEP()
等危险函数。 - 限制请求频率。
- 检测
三、防御措施优先级
- 参数化查询(必须实施)
- 输入验证(增强安全性)
- 最小权限(降低攻击影响)
- 错误处理(防止信息泄露)
- ORM/WAF(可选增强层)
四、完整防御流程示例
五、工具推荐
- 静态代码扫描:SonarQube、FindBugs
- 动态测试:SQLMap、OWASP ZAP
- 依赖检查:OWASP Dependency-Check
通过分层防御策略,结合代码级防护和基础设施防护,可有效抵御SQL注入攻击。