(Laravel) Сомнения по поводу защиты от массового присваивания

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

Когда я публикую комментарий к статье в блоге, я предполагаю, что поля «заполняемые» будут содержать тело комментария, идентификатор статьи и 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, а не от ввода.


person Andrea de'Rose    schedule 27.08.2015    source источник


Ответы (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 в качестве поля, но все же позволит вам быстро назначать пользовательские поля без необходимости перечислять их везде, где вам нужно это сделать.

person stef    schedule 27.08.2015

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

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

Теперь поля можно изменять. Именно от этого и призвано защищать массовое присвоение.

person Zsw    schedule 27.08.2015