是否有可能防止Node.js中的SQL (最好是使用一个模块),就像PHP准备了保护它们的语句一样。
如果是这样的话,是怎么做的?如果不是的话,什么是可能绕过我提供的代码的示例(参见下面)。
一些背景:
我正在使用Node.js + MySql模块制作一个后端堆栈的web应用程序。从可用性的角度来看,这个模块是很棒的,但是它还没有实现类似于准备好的陈述的东西(虽然我知道它在待办事项上)。
据我所知,PHP实现了准备语句,除其他外,防止了帮了大忙注入。不过,我担心我的node.js应用程序可能会受到类似的攻击,即使在默认情况下提供字符串转义 (如下面的代码片段所示)。
node-mysql似乎是node.js最流行的mysql连接器,所以我想知道其他人可能在做什么(如果有的话)来解释这个问题--或者这是否是node.js的一个问题(由于涉及用户/客户端的输入,所以不确定这是怎么回事)。
应该暂时切换到 节点-mysql-本机 ,因为它确实提供了准备好的语句?,我对此犹豫不决,因为它似乎没有节点mysql那么活跃(尽管这可能只是意味着它已经完成了)。
下面是一个用户注册代码片段,它使用消毒剂模块以及节点-mysql准备好的类似语句的语法(正如我前面提到的那样,这种语法可以进行字符转义),以分别防止跨站点脚本和sql注入:
// Prevent xss
var clean_user = sanitizer.sanitize(username);
// assume password is hashed already
var post = {Username: clean_user, Password: hash};
// This just uses connection.escape() underneath
var query = connection.query('INSERT INTO users SET ?', post,
function(err, results)
{
// Can a Sql injection happen here?
});发布于 2013-04-03 04:24:19
node-mysql库在使用时会自动执行转义,就像您已经在做的那样。请参阅https://github.com/felixge/node-mysql#escaping-query-values
发布于 2013-04-03 05:50:24
库在自述文件中有一个关于转义的部分。这是Javascript本机,所以我不建议切换到节点-mysql-本机。这些文件说明了这些逃逸准则:
编辑: 节点-mysql-本机也是一个纯Javascript解决方案.
true / false字符串。YYYY-mm-dd HH:ii:ss字符串X'0fa5'['a', 'b']转换为'a', 'b'[['a', 'b'], ['c', 'd']]转换为('a', 'b'), ('c', 'd')key = 'val'对。嵌套对象被转换为字符串。undefined / null转换为NULLNaN / Infinity保持原样。MySQL不支持这些,尝试将它们作为值插入将触发MySQL错误,直到它们实现支持为止。这样你就可以做这样的事情:
var userId = 5;
var query = connection.query('SELECT * FROM users WHERE id = ?', [userId], function(err, results) {
//query.sql returns SELECT * FROM users WHERE id = '5'
});此外,还有:
var post = {id: 1, title: 'Hello MySQL'};
var query = connection.query('INSERT INTO posts SET ?', post, function(err, result) {
//query.sql returns INSERT INTO posts SET `id` = 1, `title` = 'Hello MySQL'
});除了这些函数之外,还可以使用转义函数:
connection.escape(query);
mysql.escape(query);要转义查询标识符:
mysql.escapeId(identifier);作为对你对准备好的声明的评论的回应:
从可用性的角度来看,这个模块是很棒的,但是它还没有实现类似PHP准备好的语句。
准备好的语句在此连接器的待办事项列表中,但该模块至少允许您指定与准备好的语句非常相似的自定义格式。下面是自述的一个例子:
connection.config.queryFormat = function (query, values) {
if (!values) return query;
return query.replace(/\:(\w+)/g, function (txt, key) {
if (values.hasOwnProperty(key)) {
return this.escape(values[key]);
}
return txt;
}.bind(this));
};这将更改连接的查询格式,以便您可以使用如下查询:
connection.query("UPDATE posts SET title = :title", { title: "Hello MySQL" });
//equivalent to
connection.query("UPDATE posts SET title = " + mysql.escape("Hello MySQL");发布于 2018-08-24 18:53:34
MySQL -本机已经过时,因此它变成了MySQL2,它是在原始MySQL模块团队的帮助下创建的一个新模块。这个模块有更多的特性,我认为它有您想要的,因为它已经准备好了语句(由using.execute()编写),就像在PHP中那样,以获得更多的安全性。
它也非常活跃(最近的变化是从2-1天),我以前没有尝试过,但我认为这是你想要的,还有更多。
https://stackoverflow.com/questions/15778572
复制相似问题