如何在 Laravel 中保护此 sql 查询免于 SQL 注入?

Dom*_*ogh 4 php mysql sql sql-injection 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;
    }
Run Code Online (Sandbox Code Playgroud)

Mal*_*dze 5

如果您使用 laravel ORM 构建 sql 查询,您的查询将自动受到 sql 注入的保护。

例如:

$restaurant = Restaurant::where('id', $id)->first();
Run Code Online (Sandbox Code Playgroud)

这个查询是由 laravel ORM 创建的,如果你运行dd(Restaurant::where('id', $id)->toSql())你会看到 id 没有直接注入查询中:

SELECT * FROM restaurants WHERE id = ?
Run Code Online (Sandbox Code Playgroud)

你可以使用DB::select()or 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]);
Run Code Online (Sandbox Code Playgroud)

上述每个查询都不会受到 SQL 注入的影响。

不要编写这样的查询 DB::select("SELECT * FROM restaurants WHERE id = $id");这对于您的应用程序来说可能非常危险。

有关更多信息,请参阅此处:https ://laravel.com/docs/5.8/database#running-queries

希望这可以帮助。