【发布时间】:2017-04-14 08:08:53
【问题描述】:
在我目前正在进行的一个项目中,我有这样的嵌套资源
route()->resources('user', 'UserController');
route()->resources('user.place', 'PostController');
route()->resources('user.place.picture', 'PictureController');
一切正常,每次我都会传递用户的 id 等...
诀窍是当你来到一个地方时,如果这是你的,我会显示按钮来编辑和执行一些操作。所以我检查$place.user_id == $user.id 是否显示按钮。
玩了一会儿之后,因为要访问例如我的一个地方,我有以下 URL:/user/1/place/2 for the Place.show。
我是所有者,因此按钮显示并且我可以修改,但如果另一个用户(例如 user_id 2)使用相同的 URL 来查看我的位置,他无法修改任何内容,但可以查看该位置。
我发现如果该用户使用相同的 URL 但将 user_id 更改为我的,那么他可以完全访问该位置并对其进行修改。
所以为了防止这种情况,我添加了另一个条件:Auth::user()->id == $user->id
我想知道是否有解决方案来防止这种行为,因为如果我必须保护嵌套资源的每个方法,那么实现起来就会变得冗长而难看。当我进入下一个级别时user.place.picture。我想我每次下降时都需要增加另一层安全性。 $picture->place_id == $place->id 等等。
所以,当我打印一个链接以便用户可以使用正确的用户、地点、图片 ID 单击它时,没有任何东西可以阻止或检查一个 ID 是否已被修改。如果最后一个被修改,没有问题,因为它会检索另一个元素。但是,如果我们修改父母的 id 可能会很危险,尤其是当我在此过程中授予某些访问权限时。
希望有一个我错过的简单解决方案!
【问题讨论】:
标签: laravel laravel-5 model nested nested-resources