Что такое fillable и guarded? Как быстро заполнить fillable в Laravel?

Есть такая проблема в laravel, что нельзя вставлять в таблицу базы данных какую-либо информацию до тех пор, пока не заполнишь в моделе массив fillable. Но вот в чем проблема — колонок в таблице может быть много, и как перечислить их все? Ходят слухи, что достаточно вставить звездочку в массив [*] — но это неправда. Однако есть другой способ..

Зачем нужен fillable в laravel?

Несмотря на то, что любой программист знает, что основная дыра в безопасности — ввод данных пользователем, все равно мало кто уделяет достаточное внимание валидированию данных из формы, а зря! Программист, пытаясь сэкономить себе время, данные из формы напрямую добавляет в БД (к счастью, не все, но многие).

Давайте представим такую ситуацию. У Вас есть таблица users, и в ней помимо прочей информации (имя, логин, пароль …) есть такая колонка как: is_admin. Очень банальная уязвимость. Пользователь при регистрации добавляет через инспектор кода дополнительное инпут-поле с таким же именем. И присваивает ему значение 1. Какой будет результат? Пользователь сразу же получит все права админа после регистрации. Именно для таких случаев в laravel и существуют два отличных массива: fillable и guarded.

В случае, если в массив fillable не указать колонку is_admin, вылезет ошибка, и пользователь, встроивший данное поле зарегистрироваться уже не сможет!

Какая разница между fillable и guarded?

Разница очень даже простая. В массив fillable мы указываем колонки, которые разрешаем заполнять, а в guarded — которые запрещаем. Таким образом, если разобрать пример выше, то можно лишь добавить:

1

protected $guarded = [‘is_admin’]

И все остальные колонки теперь будут разрешены к записи.

Как заполнить массив fillable всеми колонками?

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

1

protected $guarded = [];

Этой строкой мы показали, что никакую колонку не надо защищать, а это значит, что теперь для записи открыты сразу все колонки! Тоже самое, что просто перечислить названия всех полей в таблице в массиве fillable. Разве что так гораздо быстрее.

Безопасно ли так делать?

Если Вы, как и я, тщательно валидируете все поступающие данные от юзера, и фильтруете их — однозначно да. Вообще, скажу я Вам, в большинстве таблиц делать это безопасно. Далеко не везде есть такая колонка, как is_admin из примера. Например, если таблица содержит в себе перечень товаров, и имеет заполняемые колонки (название, цена, рейтинг) — то здесь такая защита от массового заполнения больше мешает, чем помогает.