我需要在cakephp3中的表上进行全文搜索。我这样进行搜索:
$ids = $this->I18n->find('list', [
'valueField' => 'foreign_key',
'conditions' => [
'field IN' => ['name', 'description_search', 'description_short_search'],
'model' => 'Products',
'locale' => $lang,
'MATCH (content) AGAINST ("'.$filteredValue.'")',
],
])->toArray();
这有效,但不安全 - 这是SQL注入的理想场所。我尝试用参数(MATCH (content) AGAINST (?)' => $filteredValue
(替换它,但是生成错误 Invalid parameter number: mixed named and positional parameters
。
我该如何保护此事?
(是的,这是与标准I18N表的匹配。有点黑客,但与问题无关。(
使用bindings
这不再是绑定的工作方式,在cakephp 3.x中,您必须使用Query::bind()
方法(或使用自定义语句时StatementInterface::bindValue()
(。
$ids = $this->I18n
->find('list', [
'valueField' => 'foreign_key',
'conditions' => [
'field IN' => ['name', 'description_search', 'description_short_search'],
'model' => 'Products',
'locale' => $lang,
'MATCH (content) AGAINST (:against)',
],
])
->bind(':against', $filteredValue, 'string')
->toArray();
另请参见
- cookbook>数据库访问&ORM>查询构建器> SQL注入预防>绑定值
- API> CAKE DATABASE QUERY :: BIND((
- cookbook>数据库访问&ORM>数据库基础>绑定值
- API> CAKE DATABASE DATABASE SEACTIONFEINTEFFEED :: BINDVALUE((