【问题标题】:How should I sanitize Laravel query if using whereRaw()?如果使用 whereRaw(),我应该如何清理 Laravel 查询?
【发布时间】:2017-04-12 06:04:35
【问题描述】:

我在一个项目中使用 Laravel 5.1 和 Eloquent ORM。我需要查询数据库以查找使用他们的姓名或部分姓名的人。

如果一个人叫 John Doelington,我希望所有搜索词 johndoelinjohn doe 都能找到那个 John Doelington。但是,名字和姓氏存储在不同的列中。目前我正在使用这个查询:

$people = Person::whereRaw(
                     'CONCAT(first_name, \' \', last_name) 
                      LIKE \'%'.$search.'%\'')
                 ->get();

查看日志,我发现很多错误 - 每次出现 ' 符号时都会中断查询。看来我在 whereRaw() 函数的安全区之外,有人可以通过上帝知道什么给 SQL。

我应该在这里做什么?

我应该手动清理输入吗?如果是这样,我该怎么办?删除' 还有什么?如果查询实际上必须包含' 符号怎么办?

也许有更安全的方法来执行此查询?使用whereRaw()时,是否可以使用Eloquent但传递参数以PDO样式查询?

如果有区别,我将使用 MySQL 作为数据库。

我知道我可以为全名创建一个连接列,但是在使用此后备之前,我正在寻找一个 Eloquent 解决方案。

【问题讨论】:

    标签: laravel eloquent


    【解决方案1】:

    source code,很明显whereRaw 的第二个参数接受数组绑定,因此您可以将查询编写为:

    $search = "%{$search}%";
    $people = Person::whereRaw("(CONCAT(first_name,' ',last_name) like ?)", [$search])
                     ->get();
    

    你也可以试试Full-Text search

    【讨论】:

      猜你喜欢
      • 2018-07-03
      • 2022-01-09
      • 1970-01-01
      • 2020-02-14
      • 2023-02-15
      • 2019-10-22
      • 2019-09-01
      • 2012-05-10
      • 2021-04-22
      相关资源
      最近更新 更多