繁体   English   中英

如何从 Laravel 中的 SQL 注入保护这个 sql 查询?

[英]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 语句或表达式时,您应该始终使用参数化查询。

Laravel -> 数据库:查询生成器 -> 简介

Laravel -> 数据库:查询生成器 -> 原始表达式

如果你使用eloquent从db中保存和检索数据,你就不用担心sql注入

Eloquent 在幕后使用参数绑定,可以安全地转义 where() 中使用的任何输入。 Laravel 查询构建器使用 PDO 参数绑定来保护您的应用程序免受 SQL 注入攻击。 无需清理作为绑定传递的字符串。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM