首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >防止Node.js中的SQL注入

防止Node.js中的SQL注入
EN

Stack Overflow用户
提问于 2013-04-03 03:55:53
回答 4查看 190.6K关注 0票数 106

是否有可能防止Node.js中的SQL (最好是使用一个模块),就像PHP准备了保护它们的语句一样。

如果是这样的话,是怎么做的?如果不是的话,什么是可能绕过我提供的代码的示例(参见下面)。

一些背景:

我正在使用Node.js + MySql模块制作一个后端堆栈的web应用程序。从可用性的角度来看,这个模块是很棒的,但是它还没有实现类似于准备好的陈述的东西(虽然我知道它在待办事项上)。

据我所知,PHP实现了准备语句,除其他外,防止了帮了大忙注入。不过,我担心我的node.js应用程序可能会受到类似的攻击,即使在默认情况下提供字符串转义 (如下面的代码片段所示)。

node-mysql似乎是node.js最流行的mysql连接器,所以我想知道其他人可能在做什么(如果有的话)来解释这个问题--或者这是否是node.js的一个问题(由于涉及用户/客户端的输入,所以不确定这是怎么回事)。

应该暂时切换到 节点-mysql-本机 ,因为它确实提供了准备好的语句?,我对此犹豫不决,因为它似乎没有节点mysql那么活跃(尽管这可能只是意味着它已经完成了)。

下面是一个用户注册代码片段,它使用消毒剂模块以及节点-mysql准备好的类似语句的语法(正如我前面提到的那样,这种语法可以进行字符转义),以分别防止跨站点脚本和sql注入:

代码语言:javascript
复制
// 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?
   });
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-04-03 04:24:19

node-mysql库在使用时会自动执行转义,就像您已经在做的那样。请参阅https://github.com/felixge/node-mysql#escaping-query-values

票数 64
EN

Stack Overflow用户

发布于 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转换为NULL
  • NaN / Infinity保持原样。MySQL不支持这些,尝试将它们作为值插入将触发MySQL错误,直到它们实现支持为止。

这样你就可以做这样的事情:

代码语言:javascript
复制
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'
});

此外,还有:

代码语言:javascript
复制
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'
});

除了这些函数之外,还可以使用转义函数:

代码语言:javascript
复制
connection.escape(query);
mysql.escape(query);

要转义查询标识符:

代码语言:javascript
复制
mysql.escapeId(identifier);

作为对你对准备好的声明的评论的回应:

从可用性的角度来看,这个模块是很棒的,但是它还没有实现类似PHP准备好的语句。

准备好的语句在此连接器的待办事项列表中,但该模块至少允许您指定与准备好的语句非常相似的自定义格式。下面是自述的一个例子:

代码语言:javascript
复制
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));
};

这将更改连接的查询格式,以便您可以使用如下查询:

代码语言:javascript
复制
connection.query("UPDATE posts SET title = :title", { title: "Hello MySQL" });
//equivalent to
connection.query("UPDATE posts SET title = " + mysql.escape("Hello MySQL");
票数 16
EN

Stack Overflow用户

发布于 2018-08-24 18:53:34

MySQL -本机已经过时,因此它变成了MySQL2,它是在原始MySQL模块团队的帮助下创建的一个新模块。这个模块有更多的特性,我认为它有您想要的,因为它已经准备好了语句(由using.execute()编写),就像在PHP中那样,以获得更多的安全性。

它也非常活跃(最近的变化是从2-1天),我以前没有尝试过,但我认为这是你想要的,还有更多。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15778572

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档