[英]How can I secure this sql query from SQL Injection in Laravel?
我正在尝试在 Laravel 中创建 restAPI。 如何从 sql 注入中保护这样的 SQL 查询?
Route::get('api/restaurant/id/{id}', 'RestaurantController@getRestaurantById');
public function getRestaurantById($id) {
$restaurant = Restaurant::where('id', $id)->first();
return $restaurant;
}
如果您使用 laravel ORM 来构建您的 sql 查询,您的查询会自动受到 sql 注入的保护。
例如:
$restaurant = Restaurant::where('id', $id)->first();
这个查询是由 laravel ORM 创建的,如果你运行dd(Restaurant::where('id', $id)->toSql())
你会看到 id 没有直接注入到查询中:
SELECT * FROM restaurants WHERE id = ?
您可以使用DB::select()
或DB::raw()
... 等运行 sql 原始查询。如果您查看 Laravel 文档,您将看到每个原始方法都有数组参数,通常是第二个参数。 例如:
DB::select('SELECT * FROM restaurants WHERE id = ?', [$id]);
Restaurant::whereRaw('id = ?', [$id])->first();
...
DB::raw('SELECT * FROM restaurants WHERE id = ?', [$id]);
上述每个查询都是安全的 sql 注入。
不要写这样的查询
DB::select("SELECT * FROM restaurants WHERE id = $id");
这对您的应用程序来说可能非常危险。
有关更多信息,请查看此处: https : //laravel.com/docs/5.8/database#running-queries
希望这可以帮助。
Laravel 的数据库查询构建器提供了一个方便、流畅的界面来创建和运行数据库查询。 它可用于在您的应用程序中执行大多数数据库操作,并适用于所有支持的数据库系统。
Laravel 查询构建器使用 PDO 参数绑定来保护您的应用程序免受 SQL 注入攻击。 无需清理作为绑定传递的字符串。 介绍
请注意,如果您构建原始 SQL 语句并执行这些语句或使用原始表达式,则不会自动受到保护。
根据 Laravel 文档
Laravel 查询构建器使用 PDO 参数绑定来保护您的应用程序免受 SQL 注入攻击。 无需清理作为绑定传递的字符串。
还
原始语句将作为字符串注入到查询中,因此您应该非常小心,不要创建 SQL 注入漏洞。
在构建原始 SQL 语句或表达式时,您应该始终使用参数化查询。
如果你使用eloquent从db中保存和检索数据,你就不用担心sql注入
Eloquent 在幕后使用参数绑定,可以安全地转义 where() 中使用的任何输入。 Laravel 查询构建器使用 PDO 参数绑定来保护您的应用程序免受 SQL 注入攻击。 无需清理作为绑定传递的字符串。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.