如何使用Eloquent在Laravel中转义以下查询:
$someCollection->where(DB::raw("CONCAT(`field1`, ' ', `field2`)"), 'LIKE', "%".$user_input."%");
我想知道Eloquent的where
方法是否在转义$user_input
参数,即使这样使用也是DB::raw
如此。有任何想法吗?
简短的答案是,是的,传递给where()
Model或Eloquent Collection上调用的第3个参数将绑定到查询中,这将使其逃逸以防止注入攻击。
在后台,查询生成器不会对您的第3个参数进行任何不同的处理,具体取决于您为第1个参数传递的内容。因此,如果您将原始Expression作为第一个查询或列名传递,对Laravel来说都很好,它只会在构造WHERE子句时使用该值。如果您省略一个运算符作为第二个参数,那也很好,因为传递两个参数而不是3个参数就像传递一个=
for运算符一样。
当Laravel将查询提交到数据库时,它实际上将如下所示:
select * from `table_name` where CONCAT(`field1`, ' ', `field2`) LIKE ?
然后,Laravel(从技术上讲是PDO)将您提交的值替换为?
占位符。结果,您传递的任何值都将自动为您绑定和转义。
现在,有了转义%
符,就不必担心运算符了,因为PDO将不理它们,并且您的LIKE子句将匹配其中field1,空格和field2的串联包含用户在其中任何位置提供的字符串的任何行。 。
您可以通过仅传递一个"
字符作为输入来进行测试。如果不进行转义,查询将引发错误,但是由于已转义,因此脚本可以正常运行-尽管它可能不返回任何结果。
希望对您有所帮助!
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句