Php 如何在Yii2中安全地使用客户端定义的查询字符串参数生成ActiveQuery?
是否有一种安全的方法可以使用查询字符串参数为Yii2 ORM生成条件子句? 例如,我们需要一些食品的列表,按其性质过滤: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
GET /food/?weight[>]=1000&calories=[<]=200
但是我怀疑这种方法是安全的
因此,有三个问题:
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);