之间的区别是什么:
DB::table('some_table')
->selectRaw('COUNT(*) AS result')
->get();
和
DB::select(DB::raw("
SELECT COUNT(*) AS result
FROM some_table"));
在文档https://laravel.com/docs/5.6/queries中,他们宣传使用raw()
到期SQL注入,但与selectRaw
相同?
答案 0 :(得分:3)
两者的最终结果相同,但存在一些差异:
第一个:
DB::table('some_table')
->selectRaw('COUNT(*) AS result')
->get();
第二个:
DB::select(DB::raw("
SELECT COUNT(*) AS result
FROM some_table"
));
虽然它们有相似之处:原始查询字符串。
答案 1 :(得分:1)
这两个示例会产生相同的结果,但结果数据类型不同。
如果您不跳过查询中使用的值(尤其是那些来自用户输入的值),使用原始查询确实可以成为攻击媒介。
然而,通过使用作为任何原始查询方法的第二个参数传递的绑定可以非常轻松地减轻这种情况,如the same documentation中所示(DB::raw
和selectRaw
都接受第二个参数作为绑定数组,以及查询生成器中的其他原始方法,如whereRaw
)。实际上,在您引用的docs page的开头,第二段也说明了以下内容:
Laravel查询构建器使用PDO参数绑定来保护您的应用程序免受SQL注入攻击。无需清除作为绑定传递的字符串。
因此,只要您小心并确保任何参数作为绑定传递,而不是作为原始查询字符串中的普通值连接,您应该是安全的。