【问题标题】:Properly escaping user-input in SQL query for laravel在 Laravel 的 SQL 查询中正确转义用户输入
【发布时间】:2015-10-18 06:35:40
【问题描述】:

我目前正在我的 Laravel 5 应用程序中实现搜索功能。现在我有以下代码:

$terms = implode("* ", explode(" ", trim($query)." "));
$sql = "MATCH(title, content) AGAINST('".$terms."' IN BOOLEAN MODE)";
$results = Post::whereRaw($sql);

其中$query 是用户提供的字符串。该代码从用户那里获取(以空格分隔的)关键字并对其进行全文搜索。问题是一个简单的' 可以破坏SQL 查询并允许SQL 注入。防止这种情况的最佳方法是什么?

【问题讨论】:

  • @MarcB 我查看了文档,但找不到MATCH ... AGAINST ... 语法的本机实现。我忽略了什么吗?
  • @Lashane 我认为这里提供的答案比您链接的问题中发布的答案更优雅。这可能是因为下面提供的解决方案在 Laravel 4 中不存在。我认为这个问题提供的解决方案将有助于 Laravel 5 的未来用户。

标签: php sql laravel full-text-search laravel-5


【解决方案1】:

您可以将 PDO 绑定与 whereRaw 一起使用,这将负责转义传递的参数:

$terms = implode("* ", explode(" ", trim($query)." "));
$sql = "MATCH(title, content) AGAINST(? IN BOOLEAN MODE)";
$results = Post::whereRaw($sql, [$terms]);

【讨论】:

  • 谢谢,这似乎可行,唯一的问题是我无法再查看要调试的查询。 Laravel 内部是否在 ? (=$terms) 周围添加了 '
  • 是的。 Laravel 使用 PDO 创建准备好的语句,所以你很安全。
  • 根据我的经验,Laravel 在构建 SQL 时实际上并没有在输入周围添加'。您能否更新您的答案以包含任何未来用户看到此问题的引号?
猜你喜欢
  • 1970-01-01
  • 2013-09-27
  • 2012-06-10
  • 2015-07-15
  • 1970-01-01
  • 2018-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多