(Laravel) Сомнения относительно защиты массовых назначений

Я занимаюсь разработкой веб-сайта с несколькими материалами, включая блог, и у меня возникли некоторые сомнения относительно защиты массовых назначений.

Когда я публикую комментарий к статье в блоге, я предполагаю, что полями ‘fillable’ будут тело комментария, идентификатор статьи и parent_comment_id (необязательно и используется только для ответов на комментарий), но когда я подошел к

ArticleComment::create([
'author_id' => Auth::user()->id,
'body' => $request->input('body'),
'article_id' => $request->input('article_id'),
'parent_comment_id' => $request->input('parent_comment_id')
]);

Я обнаружил, что даже поле author_id должно быть массово назначаемым, чтобы оно сохранялось в базе данных (и не получало ошибку внешнего ключа).
Единственной альтернативой, которую я нашел, было бы собрать комментарий из нового экземпляра и сохранить его:

$comment = new App\ArticleComment();
$comment->author_id = Auth::user()->id;
$comment->body = $request->input('body');
$comment->article_id = $request->input('article_id');
$comment->parent_comment_id = $request->input('parent_comment_id');
$comment->save()

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

Я знаю, что массовое назначение должно предотвратить изменение вредоносных данных с помощью пост-запроса, но я не совсем понимаю, например, как кто-то изменил бы author_id в строке 2, так как это происходит от Auth, а не от ввода.

2

Решение

Я думаю, что в этом случае вы бы использовали new ArticleComment($request->input()) или же $comment->fill($request->input()) назначить вводимые пользователем данные, затем назначить идентификаторы или данные, не редактируемые пользователем (в вашем случае author_id) по отдельности.

$comment = new App\ArticleComment($request->input());
$comment->author_id = Auth::user()->id;
$comment->save()

Это помешает пользователям размещать форму с полем author_id в качестве поля, но все же позволяет быстро назначать пользовательские поля без необходимости перечислять их везде, где это необходимо.

1

Другие решения

В вашем примере никто не сможет его изменить. Однако что, если вы хотите назначить что-то подобное?

ArticleComment::create($request->all());

Теперь поля Можно быть изменены. Это то, от чего предназначено массовое назначение.

0

По вопросам рекламы [email protected]