【问题标题】:Quote raw sql in ZEND to avoid sql injection在 ZEND 中引用原始 sql 以避免 sql 注入
【发布时间】:2013-04-01 15:11:06
【问题描述】:

长话短说,我有一个管理部分,用户可以在其中从多个下拉列表中选择表和字段,这些表和字段必须是查询才能获得一些值。因此,ZEND 中的查询是通过连接字符串来执行的

$query = "SELECT $fieldName1, $fieldName2 from $tableName where $fieldName1 = $value";

如何使用 ZEND 方法逃避上述情况以避免 sql 注入?我尝试将它们全部添加为?并调用 quoteinto 但似乎这不适用于某些变量(如表名或字段名)

【问题讨论】:

    标签: zend-framework sql-injection


    【解决方案1】:

    ZF 有quoteIdentifier() 专门用于此目的:

    $query = "SELECT ".$db->quoteIdentifier($fieldName1).","...
    

    在您的情况下,您可能(也)想要检查有效列名的白名单。

    【讨论】:

      【解决方案2】:

      使用 quoteInto() 或 Zend_db_Select::where() 作为值,对于表和列名,我会简单地去除所有非字母字符,然后将它们包装在 ` 引号中在你的 SQL 中使用它们。

      例子:

      // Strip non alpha and quote
      $fieldName1 = '`' .  preg_replace('/[^A-Za-z]/', '', $fieldName1) . '`';
      $tableName = '`' . preg_replace('/[^A-Za-z]/', '', $tableName) . '`';
      // ....
      
      // Build the SQL using Zend Db Select
      $db->select()->from($tableName, array($fieldName1, $fieldName2))
                      ->where($fieldName1 . ' = ?', $value);
      

      【讨论】:

        【解决方案3】:

        在 SafeMysql 中,你可以让它变得如此简单,就像

        $sql  = "SELECT ?n, ?n from ?n where ?n = ?s";
        $data = $db->getAll($sql,$fieldName1,$fieldName2, $tableName, $fieldName1, $value);
        

        虽然我知道您不会将 ZF 更改为 SafeMysql。

        尽管如此,有一件基本的事情应该手动完成:
        我怀疑您是否想让用户浏览用户表或财务表或其他任何内容。 因此,您必须根据允许的表数组验证传递的表名。

        喜欢

        $allowed = ('test1','test2');
        if (!in_array($tableName, $allowed)) {
            throw new _403();
        }
        

        【讨论】:

          猜你喜欢
          • 2021-07-26
          • 1970-01-01
          • 2022-01-17
          • 2017-12-02
          • 1970-01-01
          • 1970-01-01
          • 2018-10-14
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多