随着 Node.js 的广泛应用,Web 应用程序的安全问题也变得越来越重要。攻击者利用各种漏洞和技术来攻击 Web 应用程序,从而窃取用户数据、篡改内容或者破坏系统。本文将介绍 Node.js 常见的 Web 攻击手法,并提供相应的防范措施和示例代码。
1. SQL 注入攻击
SQL 注入攻击是一种常见的攻击方式,攻击者通过构造恶意 SQL 语句来获取或修改数据库中的数据。以下是一个示例:
const username = req.body.username;
const password = req.body.password;
const sql = `SELECT * FROM users WHERE username='${username}' AND password='${password}'`;上述代码中,SQL 查询语句的参数直接从用户输入中获取,导致攻击者可以通过构造恶意输入来执行任意 SQL 语句。为了防范 SQL 注入攻击,应该使用参数化查询来代替字符串拼接,如下所示:
const username = req.body.username;
const password = req.body.password;
const sql = 'SELECT * FROM users WHERE username=? AND password=?';
db.query(sql, [username, password], (err, results) => {
// ...
});参数化查询可以防止攻击者构造恶意输入,因为输入的值会被转义或者绑定到查询语句中,而不是直接拼接在查询语句中。
2. XSS 攻击
XSS 攻击是一种常见的跨站点脚本攻击,攻击者通过注入恶意脚本来获取用户的敏感信息或者执行其他恶意操作。以下是一个示例:
const name = req.query.name;
res.send(`Hello, ${name}!`);上述代码中,查询参数 name 直接输出到响应中,导致攻击者可以注入恶意脚本。为了防范 XSS 攻击,应该对输出的数据进行转义,如下所示:
// www.javascriptcn.com code example
const name = req.query.name;
res.send(`Hello, ${escapeHtml(name)}!`);
function escapeHtml(str) {
return str.replace(/[&<>"']/g, (match) => {
switch (match) {
case '&': return '&';
case '<': return '<';
case '>': return '>';
case '"': return '"';
case "'": return ''';
default: return match;
}
});
}上述代码中,使用了一个 escapeHtml 函数来对输出的数据进行转义,可以防止攻击者注入恶意脚本。
3. CSRF 攻击
CSRF 攻击是一种跨站点请求伪造攻击,攻击者通过构造恶意请求来执行用户的操作。以下是一个示例:
app.get('/transfer', (req, res) => {
const amount = req.query.amount;
const to = req.query.to;
const from = req.session.userId;
transfer(from, to, amount);
res.send('Transfer succeeded!');
});上述代码中,转账请求中的参数直接从查询参数中获取,导致攻击者可以通过构造恶意请求来执行转账操作。为了防范 CSRF 攻击,应该在每个表单中添加一个 CSRF 令牌,如下所示:
// www.javascriptcn.com code example
app.get('/transfer', (req, res) => {
res.render('transfer', { csrfToken: req.csrfToken() });
});
app.post('/transfer', (req, res) => {
const amount = req.body.amount;
const to = req.body.to;
const from = req.session.userId;
transfer(from, to, amount);
res.send('Transfer succeeded!');
});上述代码中,使用了 csurf 中间件来生成一个 CSRF 令牌,并将其添加到转账表单中。在转账请求中,需要验证该令牌是否有效,可以使用 csurf 中间件提供的 csrf() 函数来实现。
4. 文件上传攻击
文件上传攻击是一种常见的攻击方式,攻击者通过上传恶意文件来获取或者修改服务器上的文件。以下是一个示例:
// www.javascriptcn.com code example
app.post('/upload', (req, res) => {
const file = req.files.file;
file.mv(`/uploads/${file.name}`, (err) => {
if (err) {
res.status(500).send(err);
} else {
res.send('File uploaded!');
}
});
});上述代码中,上传的文件直接保存到了服务器上的 /uploads 目录下,导致攻击者可以上传任意文件。为了防范文件上传攻击,应该对上传的文件进行检查和限制,如下所示:
// www.javascriptcn.com code example
app.post('/upload', (req, res) => {
const file = req.files.file;
if (file.mimetype !== 'image/png' && file.mimetype !== 'image/jpeg') {
res.status(400).send('Invalid file type!');
} else if (file.size > 1024 * 1024) {
res.status(400).send('File size exceeds limit!');
} else {
file.mv(`/uploads/${file.name}`, (err) => {
if (err) {
res.status(500).send(err);
} else {
res.send('File uploaded!');
}
});
}
});上述代码中,使用了 mimetype 和 size 属性来检查上传的文件类型和大小,只允许上传指定类型和大小的文件。可以根据实际需求修改这些限制条件。
结语
本文介绍了 Node.js 常见的 Web 攻击手法,并提供了相应的防范措施和示例代码。在开发 Web 应用程序时,应该注意安全问题,避免出现漏洞和攻击。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67d0d12fe46428fe9ee34076