我需要对 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 注入(inject)的完美场所。我尝试将其替换为参数 (MATCH (content) AGAINST (?)' => $filteredValue
),但这会生成错误无效的参数号:混合命名和位置参数
.
我该如何防范这种情况?
(是的,这是与标准 i18n 表的匹配。有点 hack,但与问题无关。)
最佳答案
使用绑定(bind)
这不再是绑定(bind)的工作方式了,在 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();
另请参阅
关于mysql - 防止 CakePHP3 全文索引匹配中的 SQL 注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43627949/