Web 应用安全基础

本文介绍 Web 应用中的常见安全风险与防护方案。

1. SQL 注入 (SQL Injection)

风险: 攻击者通过输入恶意 SQL 语句,获取或修改数据库数据。

易受攻击代码:

1
2
3
4
5
6
<?php
$username = $_POST['username'];
$password = $_POST['password'];
$query = "SELECT * FROM users WHERE username='$username' AND password='$password'";
$result = mysql_query($query);
?>

防护方案:

1
2
3
4
5
6
<?php
// 使用参数化查询
$stmt = $pdo->prepare("SELECT * FROM users WHERE username = ? AND password = ?");
$stmt->execute([$username, $password]);
$result = $stmt->fetch();
?>

2. 跨站脚本攻击 (XSS)

风险: 在页面中注入恶意脚本,窃取用户 Cookie 或控制页面行为。

易受攻击代码:

1
<div id="comment">{{ user_input }}</div>

防护方案:

1
2
<!-- 进行 HTML 转义 -->
<div id="comment">{{ user_input | escape }}</div>

或在 JavaScript 中:

1
2
3
4
5
function escapeHTML(text) {
const div = document.createElement('div');
div.textContent = text;
return div.innerHTML;
}

3. 跨站请求伪造 (CSRF)

风险: 利用用户已认证的状态,誘使用户执行非预期操作。

防护方案:

1
2
3
4
5
<!-- 添加 CSRF Token -->
<form method="POST" action="/transfer">
<input type="hidden" name="csrf_token" value="{{ csrf_token }}">
<input type="text" name="amount">
</form>

4. 身份验证与授权

身份验证 (Authentication): 验证用户身份

  • 使用强密码策略
  • 实施多因素认证 (MFA)
  • 安全存储密码(使用 bcrypt/Argon2)

授权 (Authorization): 验证用户权限

  • 实施最小权限原则
  • 正确检查用户权限
  • 避免使用可预测的 ID

5. 敏感数据保护

传输层:

1
2
3
✓ 使用 HTTPS/TLS 加密数据
✓ 启用 HSTS (HTTP Strict-Transport-Security)
✓ 实施 Certificate Pinning

存储层:

1
2
3
✓ 不存储敏感信息(如密码原文)
✓ 使用数据加密
✓ 定期轮换密钥

6. 常见防护检查清单

项目 状态 备注
输入验证 验证所有用户输入
输出编码 对输出内容进行转义
HTTPS 全站HTTPS传输
CSRF Token 关键操作需要验证
安全头部 CSP, X-Frame-Options 等
日志监控 记录异常活动
定期更新 及时修复安全补丁

更新于: 2026-03-23
难度: 中级
阅读时间: 8-10 分钟
参考资源: OWASP Top 10, CWE Top 25