【问题标题】:Parameterizing 'limit' and 'order' in sqlite3在 sqlite3 中参数化 'limit' 和 'order'
【发布时间】:2014-08-19 01:25:54
【问题描述】:

我有一个 sqlite 查询,我正在研究参数化以避免互联网上的不良 sql 注入...

比如:

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

非常感谢!

【问题讨论】:

    标签: sql node.js sqlite code-injection


    【解决方案1】:

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

    其他任何东西都不能参数化。 这可以是表名和列名、运算符或任何其他关键字(如 SELECT、ORDER BY 或 ASC)。

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

    【讨论】:

    • 谢谢,这很有用!我之前在做傻事,我绝对可以将limit offset中的东西参数化。
    • 您能否详细说明“自行构建语句,不使用任何未经检查的用户数据”的意思?
    猜你喜欢
    • 1970-01-01
    • 2011-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-02
    • 2017-05-12
    • 2014-01-09
    相关资源
    最近更新 更多