mysql - 防止 CakePHP3 全文索引匹配中的 SQL 注入(inject)

标签 mysql cakephp full-text-search sql-injection cakephp-3.x

我需要对 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/

相关文章:

php - 使用 CakePHPs find 返回匹配条件数组的所有记录

mysql - 在 MySQL 服务器版本 8 上执行 MySQL 查询时出错

javascript - MVC架构如何应用于Web应用程序开发?

复合唯一索引(非主索引)的验证规则

php - Cakephp 2.x 中的 Ajax

php - MySQL 全文搜索为行中出现的更多单词提供更高的排名大小

php - 全文搜索结果显示重复次数最多的单词

mysql - 如何在 SELECT QUERY 上插入条件语句或 IF ELSE FUNCTION

php - 如何使用 php 插入后更新房间状态

string - 为什么在文本编辑器的查找功能中选择 "BM algorithm"而不是 "Sunday algorithm"?