我有一个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
提前多多谢谢!
答案 0 :(得分:1)
SQLite(以及任何其他数据库)允许您参数化表达式,即语句中出现的任何数字,字符串,blob或NULL值。 这包括LIMIT / OFFSET子句中的值。
其他任何内容都无法参数化。 这可以是表名和列名,运算符或任何其他关键字(如SELECT,ORDER BY或ASC)。
如果需要更改不是表达式的SQL语句的任何部分,则必须动态创建语句。 (只要您的代码单独构造语句,而不使用任何未经检查的用户数据,就不存在SQL注入的危险。)