(Laravel)对质量分配保护的怀疑

时间:2015-08-27 14:32:09

标签: php laravel eloquent laravel-5.1 mass-assignment

我正在开发一个包含博客在内的多个内容的网站,而且我对质量分配保护提出了一些疑问。

当我在博客文章上发表评论时,我认为可以填写'字段将是评论的正文,文章ID和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()

但在这种情况下,不需要任何可填写的'字段,因为这种方式不会产生任何质量分配异常。

我知道大规模分配应该通过帖子请求来防止恶意数据更改,但我不能真正得到,例如,任何人如何修改第2行中的author_id,因为它来自Auth而不是来自输入。

2 个答案:

答案 0 :(得分:1)

我认为在这种情况下,您可以使用new ArticleComment($request->input())$comment->fill($request->input())分配用户可输入的数据,然后分配ID或非用户可编辑数据(在您的情况下,{{1分开。

author_id

这会阻止用户使用author_id作为字段发布表单,但仍允许您快速分配用户字段,而无需在需要的任何位置列出它们。

答案 1 :(得分:0)

在您的示例中,没有人能够修改它。但是,如果你想分配这样的东西呢?

while (taskList.Count > 0)
{
    Task.WaitAny();
    // Gets tasks in RanToCompletion or Faulted state
    var finishedTasks = GetFinishedTasks(taskList);
    foreach (Task<string> finishedTask in finishedTasks)
    {
        Console.WriteLine(finishedTask.Result);
        taskList.Remove(finishedTask);
    }
}

现在可以修改字段 。这就是Mass Assignement旨在防范的。