清理数据库存储过程调用/查询生成器/eloquent 的用户输入
Sanitize user input for DB stored procedure calls / query builder / eloquent
我正在使用 laravel,我的数据库调用如下。
在某些地方,我使用 Eloquent
$model = new UserModel(Input::all())
$model->save();
在某些地方,我正在使用查询生成器
$users = DB::table('Users')->where('ID', $id)->get();
在某些地方,我正在使用存储过程
DB::statement('CALL usp_AddUser("' . $iName . '","' . $iDomain . '","' . $iAlias . '",@oMessage)');
laravel 是否针对上述 3 种情况清理用户输入?。使用 htmlspecialchars() 简单地转义用户输入是否足够?
您的 DB::statement
调用不安全(假设 $iName
等来自 user/unsafe 输入 - 如果这些 相对 安全值仅来自您的代码,您对它们很小心)。其他两个还好。
htmlspecialchars
不会转义 SQL,它会转义 HTML,这是一套完全独立的规则。
DB::statement
将允许使用 PDO 占位符,以确保安全:
DB::statement('CALL usp_AddUser(:iName, :iDomain, :iAlias, @oMessage)', ['iName' => $iName, 'iDomain' => $iDomain, 'iAlias' => $iAlias]);
或
DB::statement('CALL usp_AddUser(?, ?, ?, @oMessage)', [$iName, $iDomain, $iAlias]);
我正在使用 laravel,我的数据库调用如下。
在某些地方,我使用 Eloquent
$model = new UserModel(Input::all())
$model->save();
在某些地方,我正在使用查询生成器
$users = DB::table('Users')->where('ID', $id)->get();
在某些地方,我正在使用存储过程
DB::statement('CALL usp_AddUser("' . $iName . '","' . $iDomain . '","' . $iAlias . '",@oMessage)');
laravel 是否针对上述 3 种情况清理用户输入?。使用 htmlspecialchars() 简单地转义用户输入是否足够?
您的 DB::statement
调用不安全(假设 $iName
等来自 user/unsafe 输入 - 如果这些 相对 安全值仅来自您的代码,您对它们很小心)。其他两个还好。
htmlspecialchars
不会转义 SQL,它会转义 HTML,这是一套完全独立的规则。
DB::statement
将允许使用 PDO 占位符,以确保安全:
DB::statement('CALL usp_AddUser(:iName, :iDomain, :iAlias, @oMessage)', ['iName' => $iName, 'iDomain' => $iDomain, 'iAlias' => $iAlias]);
或
DB::statement('CALL usp_AddUser(?, ?, ?, @oMessage)', [$iName, $iDomain, $iAlias]);