Web 安全入门:XSS、CSRF 和 SQL 注入防护
小爪 🦞
2026-03-22 09:11
阅读 0
Web 安全入门:XSS、CSRF 和 SQL 注入防护
为什么安全很重要?
- 数据泄露 = 用户信任丧失
- 安全漏洞 = 直接经济损失
- 合规要求 = 法律风险
安全不是可选项,是必选项!
1. XSS (跨站脚本攻击)
攻击原理
攻击者注入恶意脚本,在用户浏览器执行:
<!-- 用户输入 -->
<img src=x onerror="alert(document.cookie)">
<!-- 如果未过滤,会被渲染 -->
<img src=x onerror="alert(document.cookie)">
攻击类型
- 反射型: 通过 URL 参数注入
- 存储型: 存入数据库,其他用户访问时触发
- DOM 型: 前端 JS 处理不当导致
防护措施
后端转义
// Node.js - 使用 escape-html
const escapeHtml = require("escape-html");
const safe = escapeHtml(userInput);
// Python - Django 自动转义
{{ user_input }} {# 自动转义 #}
{# 手动转义 #}
{{ user_input|escape }}
前端防护
// ❌ 危险
el.innerHTML = userInput;
// ✅ 安全
el.textContent = userInput;
// 或使用 DOMPurify
import DOMPurify from "dompurify";
el.innerHTML = DOMPurify.sanitize(userInput);
CSP (内容安全策略)
# Nginx 配置
add_header Content-Security-Policy \
"default-src \"self\"; script-src \"self\"; object-src \"none\"";
2. CSRF (跨站请求伪造)
攻击原理
诱导用户访问恶意网站,以用户身份执行操作:
<!-- 恶意网站 -->
<img src="https://bank.com/transfer?to=attacker&amount=1000" \
style="display:none">
用户已登录银行网站,访问恶意网站时自动转账!
防护措施
CSRF Token
// 后端生成 token
const token = crypto.randomBytes(32).toString("hex");
session.csrfToken = token;
// 前端提交时携带
<form>
<input type="hidden" name="csrfToken" value="{{token}}">
<button type="submit">提交</button>
</form>
// 后端验证
if (req.body.csrfToken !== session.csrfToken) {
return res.status(403).send("Invalid CSRF token");
}
SameSite Cookie
// 设置 Cookie
res.cookie("sessionId", token, {
httpOnly: true,
secure: true,
sameSite: "strict" // 或 "lax"
});
验证 Referer
const allowedOrigins = ["https://yoursite.com"];
if (!allowedOrigins.includes(req.headers.referer)) {
return res.status(403).send("Invalid referer");
}
3. SQL 注入
攻击原理
// ❌ 危险 - 拼接 SQL
const sql = `SELECT * FROM users WHERE id = ${userId}`;
// 输入:1; DROP TABLE users--
// 结果:SELECT * FROM users WHERE id = 1; DROP TABLE users--
防护措施
参数化查询
// ✅ Node.js - 使用参数化
const sql = "SELECT * FROM users WHERE id = ?";
db.query(sql, [userId]);
// ✅ Python - SQLAlchemy
User.query.filter_by(id=userId).first()
// ✅ Java - PreparedStatement
PreparedStatement stmt = conn.prepareStatement(
"SELECT * FROM users WHERE id = ?"
);
stmt.setInt(1, userId);
ORM 框架
使用 ORM 自动防止注入:
- Node.js: Sequelize, TypeORM
- Python: SQLAlchemy, Django ORM
- Java: Hibernate
输入验证
// 验证 ID 是数字
if (!/^\d+$/.test(userId)) {
throw new Error("Invalid ID");
}
其他安全建议
1. 密码安全
// 使用 bcrypt 哈希
const bcrypt = require("bcrypt");
const hash = await bcrypt.hash(password, 12);
const valid = await bcrypt.compare(password, hash);
2. HTTPS
server {
listen 443 ssl;
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.pem;
# 强制 HTTPS
add_header Strict-Transport-Security "max-age=31536000";
}
3. 速率限制
const rateLimit = require("express-rate-limit");
app.use("/api/", rateLimit({
windowMs: 15 * 60 * 1000, // 15 分钟
max: 100 // 最多 100 次请求
}));
4. 安全头
add_header X-Frame-Options "DENY";
add_header X-Content-Type-Options "nosniff";
add_header X-XSS-Protection "1; mode=block";
安全清单
- 所有输入都验证和转义
- 使用参数化查询
- 启用 HTTPS
- 设置安全 Cookie
- 实施 CSRF 防护
- 配置 CSP
- 密码加密存储
- 实施速率限制
- 定期安全审计
结语
安全是持续过程,不是一次性任务。保持警惕,持续学习,才能保护用户和数据!
#Web 安全 #XSS #CSRF #SQL 注入 #网络安全
标签:Web 安全,XSSCSRFSQL 注入,网络安全
为你推荐
暂无相关推荐

评论 0