参数化限制'和'命令'在sqlite3中

时间:2014-08-19 01:25:54

标签: sql node.js sqlite code-injection

我有一个sqlite查询,我正在调查参数化以避免在互联网上输入错误的SQL ...

所以像:

Select * From myTable Where id = $id
如果我在某处定义了$ id并将其作为参数传递给我的db调用,那么

就可以了。

paramters.$id = 150;

db.all(myQuery, parameters, function (err, rows) {
  results = rows;
});

我想知道我是否需要不遗余力地参数化排序和分页的内容(两者都是用户可以提供的输入)......

我尝试过这样的事情:

    var sorter = JSON.parse(value);
    parameters.$sortMethod = sorter.method;
    parameters.$sortOrder = sorter.order;
    sort_filter += 'ORDER BY $sortMethod $sortOrder';

尽管没有骰子。我猜测sqlite3并不能让你参数化ORDER,LIMIT和OFFSET中的东西。我认为有些东西可能是偷偷摸摸的,也许那里的人可以通过在命令中过早地结束sqlite语句然后创建一个新的恶意语句来做,但也许SQLITE3只允许你一次练习一个语句(http://www.qtcentre.org/threads/54748-Execute-multiple-sql-command-in-SQLITE3)< / p>

我是否应该担心在订单限制和抵消方面对参数进行参数化?作为参考,我在这个sqlite库的node.js上运行它:https://github.com/mapbox/node-sqlite3

提前多多谢谢!

1 个答案:

答案 0 :(得分:1)

SQLite(以及任何其他数据库)允许您参数化表达式,即语句中出现的任何数字,字符串,blob或NULL值。 这包括LIMIT / OFFSET子句中的

其他任何内容都无法参数化。 这可以是表名和列名,运算符或任何其他关键字(如SELECT,ORDER BY或ASC)。

如果需要更改不是表达式的SQL语句的任何部分,则必须动态创建语句。 (只要您的代码单独构造语句,而不使用任何未经检查的用户数据,就不存在SQL注入的危险。)