【发布时间】:2013-03-24 14:25:25
【问题描述】:
是否有可能像 PHP 中的 Prepared Statements 一样防止 SQL 注入(最好使用模块)。
如果是这样,怎么做?如果不是,有哪些示例可能会绕过我提供的代码(见下文)。
一些上下文:
我正在使用node-mysql 模块制作一个带有由Node.js + MySql 组成的后端堆栈的Web 应用程序。从可用性的角度来看,这个模块很棒,但它还没有实现类似于 PHP 的 Prepared Statements 的东西(尽管我知道它在 todo 上)。
据我了解,PHP 对预处理语句的实现,除其他外,helped greatly 用于防止 SQL 注入。不过,我担心我的 node.js 应用程序可能会受到类似的攻击,even with the string escaping provided by default(如下面的代码 sn-p 所示)。
node-mysql 似乎是 node.js 最流行的 mysql 连接器,所以我想知道其他人可能会做什么(如果有的话)来解决这个问题 - 或者它是否甚至是 node.js 的问题开始(不确定如何,因为涉及用户/客户端输入)。
我是否应该暂时切换到node-mysql-native,因为它确实提供了准备好的语句?我很犹豫,因为它似乎不像 node-mysql 那样活跃(虽然这可能只是意味着它已经完成)。
这是一个用户注册码的 sn-p,它使用sanitizer 模块,以及 node-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?
});
【问题讨论】:
标签: javascript mysql node.js sql-injection node-mysql