Php 如何在Yii2中安全地使用客户端定义的查询字符串参数生成ActiveQuery?

Php 如何在Yii2中安全地使用客户端定义的查询字符串参数生成ActiveQuery?,php,yii2,query-string,sql-injection,Php,Yii2,Query String,Sql Injection,是否有一种安全的方法可以使用查询字符串参数为Yii2 ORM生成条件子句? 例如,我们需要一些食品的列表,按其性质过滤: GET /food/?weight[>]=1000&calories=[<]=200 但是我怀疑这种方法是安全的 因此,有三个问题: 如何从url安全地定义属性?在ActiveQuery::where子句中使用之前,我们是否可以清理查询字符串参数名称(而不是值) 如何正确地定义运算符,例如,IN,AND,OR,>,=,最后,我找到了解决方案。 似乎Yii

是否有一种安全的方法可以使用查询字符串参数为Yii2 ORM生成条件子句? 例如,我们需要一些食品的列表,按其性质过滤:

GET /food/?weight[>]=1000&calories=[<]=200
但是我怀疑这种方法是安全的

因此,有三个问题:

  • 如何从url安全地定义属性?在
    ActiveQuery::where
    子句中使用之前,我们是否可以清理查询字符串参数名称(而不是值)

  • 如何正确地定义运算符,例如,
    IN,AND,OR,>,=,最后,我找到了解决方案。
    似乎Yii2通过
    DataFilter
    类提供了这样的功能。 该类的官员和使用它的用户

    根据文件

  • 定义一个用于验证的模型

    class SearchModel extends \yii\base\Model
    {
        public $id;
        public $name;
    
        public function rules()
        {
            return [
                [['id', 'name'], 'trim'],
                ['id', 'integer'],
                ['name', 'string'],
            ];
        }
    }
    
  • 创建过滤器:

    $filter = new DataFilter(['searchModel' => $searchModel]);
    
  • 使用数据填充筛选器,然后验证

    if ($filter->load(\Yii::$app->request->get())) { 
       $filterCondition = $filter->build();
       if ($filterCondition === false) { // if error occure
           // the errors are stored in the filter instance
           return $filter;
       }
    }
    
  • 查询中使用内置条件

    $query->andWhere($filterCondition);
    

  • 这绝对不安全-这段代码容易受到SQL注入的攻击。@rob006那么,正确的方法是什么呢?
    $query->andWhere($filterCondition);