Node.JS - URL 参数中的 SQL 注入?

Node.JS - SQL Injection in URL parameters?

提问人:Tibia Cams 提问时间:11/13/2022 最后编辑:Tibia Cams 更新时间:11/13/2022 访问量:407

问:

我正在尝试学习 Node.js,我目前正在制作一个 Express 应用程序(使用 ejs),该应用程序将从 MySQL 数据库返回值,具体取决于用户访问的 URL。

例如,访问将列出 db 表中的所有用户。该链接将返回有关ID号为3的用户的信息。http://localhost:3000/testusershttp://localhost:3000/test/3

我的代码:/test

app.get("/test", (req, res) => {
    let sql = "SELECT * FROM users ORDER BY name";
    db.query(sql, function (err, results, fields) {
        if (err)
            logmessage(err.message);
        
        res.render("test", { data: results });
    });
});

这是 /test/:id 的代码

app.get("/test/:id", (req, res) => {
    var userId = req.params.id;

    let sql = "SELECT * FROM users WHERE id = " + userId;
    db.query(sql, function (err, results, fields) {
        if (err || !results.length) {
            res.redirect("/");
        } else {
            res.render("test_user", { data: results });
        }
    });
});

我的问题是:这安全吗?当我以前从事PHP开发工作时,我习惯于在进行任何查询之前准备语句。

如果用户将 URL 从 : 更改为 并在 url 末尾插入一些 SQL 注入代码,会发生什么情况?数据库会被破坏吗?http://localhost:3000/test/3

这将用于 Web 上的实时应用程序,因此不能进行 SQL 注入非常重要。我还想稍后添加一个表单(req.body 而不是 req.params),我也需要对其进行清理。

或者 Node 中是否已经内置了“准备好的语句”?

MySQL 节点 .js Express 安全性 SQL 注入

评论

1赞 derpirscher 11/13/2022
不,这不安全。请参阅 sql 库文档,了解如何正确创建预准备语句。

答:

1赞 Heiko Theißen 11/13/2022 #1

如果使用占位符,则会阻止 SQL 注入:

let sql = "SELECT * FROM users WHERE id = ?";
db.query(sql, [userId], function (err, results, fields) {...});
0赞 Juan Arias 11/13/2022 #2

您是否尝试过实现 Sequelize?据我所知,ORM 会阻止 SQL 注入。此外,它非常易于使用:)

评论

0赞 Community 11/16/2022
正如目前所写的那样,你的答案尚不清楚。请编辑以添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。您可以在帮助中心找到有关如何写出好答案的更多信息。