【问题标题】:Laravel protect form hidden fields and urlLaravel 保护表单隐藏字段和 url
【发布时间】:2015-06-13 10:13:28
【问题描述】:

我使用刀片进行了编辑以编辑资源,如下所示:

{{Form::model( $post ,['action'=> ['PostController@update', 'id' => $post->id], 'method' => 'post'])}}

生成带有动作的表单

http://example.com/posts/edit/123

还有我的字段,有文本和隐藏输入

看到这个网址,不怀好意的用户很容易更新其他帖子。

如果 id 被检查器操纵,我如何保护路由以使其失败?是否有任何内置的 wat 来标记 id 以确保它匹配?这也可以应用于所有隐藏的输入吗?

谢谢

编辑:

我的隐藏字段用法示例: 我的帖子一般都是问答,当用户尝试添加问题的答案时,我将 question_id 设置为隐藏字段,并且我想检查它是否被操纵。

【问题讨论】:

  • 您应该通过身份验证和授权来保护您的数据,而不是试图保护您的 URL。与其依赖用户不知道正确的 URL,不如检查登录名和(如果需要)用户权限
  • 我已经这样做了 $this->abortIfLoggedUserCantEdit( $post->user->id );我只想要一个更通用的功能。
  • 您可能正在寻找像 SentryEntrust 这样的 ACL 系统
  • 好吧,你不能总是为自己辩护,但是你可以这样做:在请求 edit 方法时设置一个等于模型 ID 的 Session 变量,然后拉提交表单时会话中的该变量,find() 具有该 ID 的模型并更新它。这样,您甚至不需要将 ID 保留在 URL 或隐藏字段中。听起来像是一个很好的中间件练习!

标签: php forms security laravel laravel-4


【解决方案1】:

为了保护路线,您应该检查PostController@update 中的权限。

在方法开始检查用户是否可以编辑给定的帖子:

public function update($postId)
{
    $post = Post::findOrFail($postId);

    if ($post->user_id !== Auth::id()) {
        abort(403, 'Unauthorized action.');
    }

    // validate, update record, etc.
}

【讨论】:

  • 我正在这样做,但我想要一种通用的方式来为我的所有编辑路线执行此操作,而且我无法以这种方式保护隐藏字段
  • 我不知道是否有办法为您的所有编辑路线执行此操作。您可以使用过滤器,但您将拥有其他参数名称不同的路由,并且您将使用不同的关系。您最终会为每个控制器拥有 1 个过滤器。
  • Auth::id() 还是Auth::user()->id
  • 我认为表单中的隐藏输入带有散列的 id,并检查路由中的 id 和散列匹配是否可以工作
【解决方案2】:

Limonte 的回答是正确的,以确保能够编辑其他人的帖子 - 您应该始终这样做。回答你问题的后半部分:

我将 question_id 设置为隐藏字段,我想检查它是否被操纵。

问题在于您可以永远信任客户端向您的系统提供的数据。您必须始终假设它已被篡改。

帮助最小化风险的一个选项是您可以使用encryption service by Laravel 来执行此操作:

{{ Form::hidden('question_id', Crypt::encrypt($question_id)) }}

然后在你的控制器中

$question_id = Crypt::decrypt(Input::get('question_id'));

只需确保您在 app.php 配置文件中设置了随机应用程序加密密钥

【讨论】:

  • 我将在我的所有表单中添加一个加密的 route_id,并放置一个过滤器来检查每个请求。
  • @Laurence,我也在尝试在我的项目中实现这一点,但经过一番思考,我去了那个,只加密 id 字段不太好。因为,我可以去 id X 的用户,检查表单中的加密 id,然后去用户角色,并放置相同的加密 id X,如果 id X 的角色存在,它将是有效的。为了解决这个问题,每个模型应该有唯一的 id,所以我们可以在 id 字段模型名称或数据库表名称之前添加加密。
  • 如何在 HTML
    中使用 Crypt::encrypt 而不是使用 {{ Form }} ?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-13
  • 1970-01-01
  • 2014-10-30
  • 1970-01-01
  • 2019-05-19
  • 2010-12-11
相关资源
最近更新 更多