sql - 在sqlite3中参数化 'limit'和 'order'

标签 sql node.js sqlite code-injection

我有一个 sqlite 查询,我正在研究参数化以避免互联网上出现错误的 sql 注入(inject)...

所以像这样的事情:

Select * From myTable Where id = $id

如果我在某处定义了 $id 并将其作为参数传递给我的数据库调用,那就没问题了。

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 )

我是否应该担心参数化顺序限制和偏移量?作为引用,我使用这个 sqlite 库在 node.js 上运行它:https://github.com/mapbox/node-sqlite3

提前致谢!

最佳答案

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

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

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

关于sql - 在sqlite3中参数化 'limit'和 'order',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25374386/

相关文章:

sqlite - 使用来自数据网格的数据填充组合框,从 sqlite 数据库接收数据

mysql - 需要数据库两个月前每小时的数据

sql - VB6语法问题, "no current record"错误

node.js - 我如何总结我的 mongodb 集合中的值?

java - 如何在Android中创建SQLite数据库

xcode - 检索实体名称时崩溃?

python - SQLite 外键示例

python - 急切加载邻接列表关系

jquery - 从数据中获取电子邮件 ID 的正则表达式

javascript - Discord.js 如何制作建议命令?