Безопасность в Laravel: Как защитить ваше приложение Часть 1


SQL-инъекции

В обычном PHP нам нужно связывать все параметры в SQL-запросах. Но в Laravel у нас есть конструктор запросов и Eloquent ORM, которые обеспечивают автоматическую защиту от SQL-инъекций, добавляя привязку параметров по умолчанию. Но даже при этом вы должны остерегаться вредоносных запросов, таких как, например:

User::query()->create($request->all());
Войти в полноэкранный режим Выйти из полноэкранного режима

Этот код может привести к массовому назначению. В этом случае пользователь может отправить полезную нагрузку, подобную следующей:

{
    "name": "Basim Ghouri",
    "email": "basim@gmail.com",
    "role_id": "admin" 
}
Войти в полноэкранный режим Выйти из полноэкранного режима

Другим кодом, который может привести к той же проблеме, может быть:

$user->fill($request->all());
$user->save();
Войти в полноэкранный режим Выйти из полноэкранного режима

В этом примере мы наполняем модель eloquent всеми данными из запроса и затем сохраняем их.

Злонамеренный пользователь может попробовать использовать различные полезные нагрузки. Или они могут добавить дополнительные входы с разными именами и попытаться найти слабую реализацию, подобную этой.

Надеюсь, на этом примере мы видим, что нам нужно заботиться о массовых назначениях. Мы не можем доверять любому пользовательскому запросу, потому что любой пользователь может открыть инспектор браузера и добавить вход в монолит или изменить полезную нагрузку из API.

Laravel предоставляет различные способы справиться с этим:

Set Fillable Property

Мы можем предотвратить массовое присвоение, явно добавив поля, которые содержит модель, с помощью защищенных свойств, «fillable» или «guarded»:

protected $fillable = ['name', 'email', 'password', 'role_id'];
Войти в полноэкранный режим Выйти из полноэкранного режима

В данном случае мы добавляем явно столбцы, которые содержит модель. Вы можете использовать свойство guarded как пустой массив. Лично мне такой подход не нравится, поскольку во многих проектах работает более одного разработчика и нет гарантии, что другие разработчики проверят данные.

Метод forceFill() может пропустить эту защиту, поэтому будьте осторожны при использовании этого метода.

Валидация данных запроса

Вы должны проверять любой тип ресурса, независимо от того, откуда он пришел. Лучшая политика — не доверять пользователю. Laravel предоставляет FormRequest, поэтому нам нужно только создать его с помощью artisan:

php artisan make:request UserRequest
Войти в полноэкранный режим Выйти из полноэкранного режима

Вы можете определить правила для проверки ваших запросов:

public function authorize() 
{
    return $this->user()->check(); 
} 

public function rules() 
{     
    return [
        'name' => ['required', 'string', 'min:5', 'max:255'],
        'email' => ['required', 'email', 'unique:users'],
        'password' =>   ['required', Password::default()]
    ]; 
}
Вход в полноэкранный режим Выйти из полноэкранного режима

Метод authorize должен возвращать булево значение. Это удобный способ вернуть подтверждение авторизации, прежде чем начать проверку запрашиваемого содержимого. Это нужно иметь в виду, и это применимо в любом маршруте, который имеет промежуточное ПО auth для web или sanctum/API, если вы используете аутентификацию на основе токенов.

Метод rules возвращает массив с правилами, которые проверяют ваш запрос. Вы можете использовать множество правил из коробки или создать свои собственные правила. Если вам интересно углубиться в эту тему, вы можете найти все правила в документе: https://laravel.com/docs/8.x/validation#available-validation-rules.

Оцените статью
Procodings.ru
Добавить комментарий