【问题标题】:MeekroDB - how to safely pass ORDER BY field names and arguments?MeekroDB - 如何安全地传递 ORDER BY 字段名称和参数?
【发布时间】:2016-10-13 15:15:35
【问题描述】:

我在一个 PHP 项目中使用 MeekroDB。对于某些查询,我需要传递任意字段名称进行排序。 meekro 网站上没有 ORDER BY 子句的示例。

如何安全地传递字段名称并避免 SQL 注入漏洞?我意识到我可以事先使用有效字段列表检查每个字段名称,但我试图让这段代码更概括为一个基本的“get”函数:function get(Array $filters, Array $sort_by)

在传递字段名称时,%b 占位符(反引号)是否足以防止任意代码注入?

例如:

SELECT * FROM table1 ORDER BY %b

或者对于多个字段:

SELECT * FROM table1 ORDER BY %lb

这样安全吗?

另外,我怎样才能根据需要任意包含 DESC 或 ASC 修饰符?

【问题讨论】:

    标签: php mysql sql-injection meekro


    【解决方案1】:

    是的,您可以安全地使用blb,因为它们都使用安全的formatTableName 方法实现。

    不幸的是,方向修饰符应该手动清理,像这样

    $dirs  = ["ASC","DESC"]; 
    $key   = array_search($_GET['dir'], $dirs); // see if we have such a value
    $dir   = $dirs[$key]; //if not, first one will be set automatically. smart enuf :)
    $query = "SELECT * FROM table1 ORDER BY %b $dir"; //value is safe
    

    【讨论】:

    • 感谢您的回答!如何添加多个 ORDER BY 字段,每个字段都有自己的方向修饰符?例如 SELECT * FROM table1 ORDER BY field1 DESC,field2 ASC?实际的 meekro DB::query() 函数看起来如何? (我意识到我可以遍历订单字段并为每个“字段”和“方向”说明符添加一个 %b %l。但我不明白如何将这些动态传递给 DB::query 函数。
    • 这将是一项艰巨的任务。我的建议是在 Meekro github 上打开一个问题,描述一种情况并建议 b 和 lb 修饰符都可以接受由字段名称和方向组成的数组。或者您可以通过单独的bs 提出您自己的建议。我不应该很复杂。
    • 使用单独的 %b 和 %l 需要将任意数量的参数传递给 DB::query () 。我将不得不使用 eval 来调用它,我认为这不是一个好习惯。有什么建议吗?
    • 永远不需要评估。自 PHP 5.6 以来,有一个很棒的 splat 运算符,当您可以为接受参数列表的函数发送数组时,就像这样:$results = DB::query($sql, ...$parameters); 如果您的 PHP 已经过时,那么您必须坚持call_user_func_array()
    • 不错。我不知道那个运营商!完美。
    猜你喜欢
    • 1970-01-01
    • 2018-06-11
    • 1970-01-01
    • 2020-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多