首页 > 解决方案 > Laravel 中的 orderBy() 方法是否提供针对 sql 注入的保护?

问题描述

Laravel 中的 orderBy() 方法是否提供针对 sql 注入的保护?

Ex: 
$column = "SUBSTRING_INDEX(material_type, '\\\', -1)";
$sort = 'desc';
DB::table('students')->orderBy(DB::raw($column), $sort)->get();

标签: phplaravel

解决方案


->orderBy(DB::raw($column), $sort)不安全,原始表达式总是容易受到 SQL 注入的攻击。

你可以使用->orderBy($column, $sort),但我不推荐它。

Laravel不对列名使用参数绑定,因为底层PDO不支持它(参考)。参数绑定只能用于值 ( where name = ?)。

Laravel 试图通过列名(引用)来防止 SQL 注入,但我不会依赖它。我假设您有一个允许的列名列表,因此将其用作白名单:

$columns = ['id', 'name', 'created_at', ...];
if(!in_array($column, $columns, true)) {
    // Throw an exception or set $column to a secure default value.
}

asc如果提供的值无效(参考),Laravel 使用默认方向。
所以我想说你不必检查$sort自己。


推荐阅读