Escape Laravel DB:使用Eloquent的原始查询

时间:2016-03-25 22:31:48

标签: laravel laravel-5

如何使用Eloquent:

在Laravel中转义以下查询
$someCollection->where(DB::raw("CONCAT(`field1`, ' ', `field2`)"), 'LIKE', "%".$user_input."%");

我想知道Eloquent的where方法是否正在逃避$user_input参数,即使这样使用DB::raw也是如此。 有什么想法吗?

1 个答案:

答案 0 :(得分:1)

简短的回答是,是的,传递给模型或Eloquent Collection上调用的where()的第3个参数将被绑定在查询中,这将逃脱它以防止注入攻击。

在幕后,查询生成器不会根据您为第一个参数传递的内容而区别对待您的第三个参数。因此,如果您将原始表达式作为第一个查询或列名称传递,它对Laravel一切都很好,它将在构造WHERE子句时使用该值。如果省略运算符作为第二个参数,那也没关系,因为传递两个参数而不是3,就像为运算符传递=一样。

当Laravel将您的查询提交到您的数据库时,它实际上将如下所示:

select * from `table_name` where CONCAT(`field1`, ' ', `field2`) LIKE ?

然后,Laravel(技术上是PDO)将您提交的值绑定到?占位符。因此,您传递的任何值都将自动绑定和转义。

现在,通过转义,无需担心%运算符,因为PDO将不管它们,并且您的LIKE子句将匹配field1,space和field2的串联包含的任何行用户提供的字符串。

您可以通过仅传递"个字符作为输入来测试。如果它没有被转义,查询将抛出一个错误,但由于它被转义,脚本运行正常 - 尽管它可能没有返回任何结果。

希望有所帮助!