1. 跨站脚本攻击(XSS,Cross-Site Scripting)
描述: XSS 是一种常见的 Web 安全漏洞,攻击者通过向受信任的网页中注入恶意 JavaScript 脚本,使其在其他用户的浏览器中执行。常见的目标包括窃取 Cookie、会话令牌、或通过伪造页面来欺骗用户。
防御方法:
- 对所有用户输入进行 输出编码,特别是在 HTML、JavaScript 和 URL 中输出时。
- 使用安全的 JavaScript 模板引擎或库,如
DOMPurify。 - 使用
Content Security Policy (CSP)限制恶意脚本的执行。
攻击示例: 攻击者在评论区输入恶意脚本,导致其他用户访问该页面时触发脚本:
<input type="text" value="<script>alert('XSS');</script>">
修正示例: 使用输出编码,确保用户输入不会被浏览器解释为代码:
function escapeHTML(text) {
return text.replace(/</g, "<").replace(/>/g, ">");
}
const safeValue = escapeHTML(userInput);
document.querySelector('input').value = safeValue;
2. 跨站请求伪造(CSRF,Cross-Site Request Forgery)
描述: CSRF 攻击利用用户在目标网站上的身份发起未授权的请求。攻击者通过引诱用户点击恶意链接或加载特定页面,导致用户在不知情的情况下执行了某些敏感操作(如修改账户信息或进行资金转账)。
防御方法:
- 使用 CSRF 令牌 来验证请求的合法性,每个表单或请求都应包含唯一的令牌。
- 验证请求的来源,使用
Referer或Origin头来确认请求来源的合法性。 - 对关键操作使用双重验证(如短信或邮箱验证)。
攻击示例: 攻击者诱导用户点击恶意链接,伪造转账请求:
<img src="<https://bank.com/transfer?amount=1000&to=attacker_account>" style="display:none;">
修正示例: 使用 CSRF 令牌确保请求的合法性:
<form action="/transfer" method="POST">
<input type="hidden" name="csrf_token" value="{{ csrf_token }}">
<input type="text" name="amount">
<button type="submit">Transfer</button>
</form>
服务器验证 csrf_token 的有效性,防止 CSRF 攻击。
3. SQL 注入(SQL Injection)
描述: SQL 注入是指攻击者通过向应用程序输入恶意的 SQL 语句来操控数据库查询。这种攻击可能导致数据库数据泄露、篡改,甚至在严重的情况下完全删除数据库。
防御方法:
- 使用 预编译语句 或 参数化查询,避免将用户输入直接拼接到 SQL 语句中。
- 对用户输入进行严格的类型验证,避免非法字符的注入。
- 限制数据库用户的权限,确保即使发生攻击,也只能最小化损失。
攻击示例: 攻击者通过输入构造的 SQL 语句绕过认证:
SELECT * FROM users WHERE username = 'admin' AND password = '' OR '1'='1';
这条查询语句会使登录认证失效,允许攻击者绕过密码验证。
修正示例: 使用参数化查询防止 SQL 注入:
const query = "SELECT * FROM users WHERE username = ? AND password = ?";
db.query(query, [username, password], (err, results) => {
if (err) throw err;
// 处理查询结果
});
这种方式会确保用户输入被当作参数处理,而不是 SQL 语句的一部分。
4. 命令注入(Command Injection)
描述: 命令注入是一种通过向应用程序提供恶意输入,导致服务器执行未授权的系统命令的攻击方式。攻击者可以通过构造输入直接控制服务器,执行任意命令,窃取数据或破坏系统。
防御方法:
- 避免直接使用用户输入来构建系统命令,使用语言的安全 API 来处理系统命令。
- 对用户输入进行严格的校验,只允许符合预期格式的输入。
- 限制应用程序对系统命令的访问权限,使用容器化或沙盒技术隔离风险。
攻击示例: 攻击者通过输入 & rm -rf / 删除服务器的文件:
const exec = require('child_process').exec;
exec('ls ' + userInput); // 如果 userInput 是 '& rm -rf /',可能导致系统崩溃
修正示例: 使用参数化的方式避免注入风险:
const execFile = require('child_process').execFile;
execFile('ls', [userInput], (error, stdout, stderr) => {
if (error) throw error;
console.log(stdout);
});
5. 文件上传漏洞
描述: 文件上传漏洞是指应用允许攻击者上传恶意文件(如脚本文件、木马等),然后在服务器上执行这些文件。攻击者可以通过上传精心构造的文件,来执行恶意代码或获取服务器敏感信息。
防御方法:
- 对上传的文件类型和扩展名进行严格的验证,限制可接受的文件格式。
- 将上传文件存储在不可执行的目录中,避免直接在服务器上运行用户上传的文件。
- 为上传的文件生成随机文件名,防止文件被覆盖。
攻击示例: 攻击者上传一个 .php 文件,服务器错误地允许执行该文件:
<?php
echo "File uploaded successfully!";
system($_GET['cmd']); // 可以执行任意命令
?>
修正示例: 通过验证文件类型和扩展名,避免文件被执行:
const allowedTypes = ['image/jpeg', 'image/png'];
if (!allowedTypes.includes(file.mimetype)) {
throw new Error('Invalid file type');
}
6. 目录遍历攻击(Directory Traversal)
描述: 目录遍历攻击(也称为路径遍历攻击)是指攻击者通过修改 URL 或输入路径参数,访问到服务器上未授权的文件或目录,可能导致泄露敏感文件,如配置文件、用户信息等。
防御方法:
- 对用户输入的文件路径进行严格过滤,禁止使用
../等跳转符号。 - 限制应用程序只能访问特定的目录,并确保对文件系统进行最小权限访问。
- 使用安全的文件系统 API,避免直接处理用户输入的路径。
攻击示例: 攻击者通过输入 ../../etc/passwd 访问服务器上的敏感文件:
<http://example.com/view?file=../../etc/passwd>
修正示例: 验证输入路径,并使用安全的文件路径处理方法:
const path = require('path');
const safePath = path.join(__dirname, 'uploads', fileName);
if (!safePath.startsWith(path.join(__dirname, 'uploads'))) {
throw new Error('Invalid path');
}
7. 拒绝服务攻击(DoS/DDoS,Denial of Service)
描述: 拒绝服务攻击通过大量的请求耗尽服务器资源,导致合法用户无法正常访问服务。分布式拒绝服务攻击(DDoS)是通过多个来源同时发起攻击,进一步加大服务器的压力。
防御方法:
- 实施流量限制(rate limiting),限制单个用户的请求频率。
- 使用负载均衡和 CDN(内容分发网络)来分散流量。
- 实时监控服务器状态,配置自动扩展以应对突发流量。
攻击示例: 攻击者通过发送大量无效请求,使服务器资源耗尽:
while true; do curl <http://example.com>; done
修正示例: 通过流量限制机制限制单个用户的请求频率:
const rateLimit = require('express-rate-limit');
const limiter = rateLimit({
windowMs: 15 * 60 * 1000, // 15 分钟窗口
max: 100 // 每个 IP 最多 100 次请求
});
app.use(limiter);
8. 点击劫持(Clickjacking)
描述: 点击劫持是一种欺骗用户点击网页上隐藏按钮的攻击方式。攻击者在透明的 iframe 中嵌入目标网站,引导用户在不知情的情况下点击,执行攻击者意图的操作
。
防御方法:
- 使用
X-Frame-OptionsHTTP 头,阻止页面被嵌入到 iframe 中。 - 配置
Content Security Policy (CSP)以限制页面加载的外部资源。
攻击示例: 攻击者使用 iframe 将敏感页面嵌入到其恶意网站中,并诱导用户点击:
<iframe src="<https://bank.com/transfer>" style="opacity:0; position:absolute;"></iframe>
修正示例: 通过设置 X-Frame-Options 头,防止页面被嵌入:
X-Frame-Options: DENY
总结
Web 攻击方式千变万化,但了解并实施适当的防御措施可以有效防止大多数攻击。关键的防御策略包括:
- 输入验证和输出编码:避免注入攻击,如 XSS 和 SQL 注入。
- CSRF 令牌和安全性验证:防止 CSRF 攻击。
- 安全配置和权限控制:防止文件上传、目录遍历等风险。
- 流量限制和监控:应对拒绝服务攻击。
- HTTP 头和 CSP:增强网页的安全性,防止点击劫持等攻击。
通过这些措施,你可以显著提高 Web 应用的安全性,保护用户和数据免受攻击。