在页面上,用户会有几个帖子。每个帖子都有一个id#来标识在编辑或删除帖子时使用的内容。使用刀片,我可以使隐藏ID ID仅在经过身份验证的用户位于自己的配置文件时显示(因为只允许他们编辑或删除帖子)。
但是,我也喜欢使用隐藏的ID div。我不希望有人查看页面源,更改ID,然后单击“喜欢”按钮。有没有办法在视图中包含ID,但不允许更改它?
我可以尝试对每个进行一些验证,例如匹配用户,正文,发布时间和ID,如果不匹配则抛出错误。好奇,如果有更好的方法。
查看:
<div class="post-like">
<a href="{{ route('post.like', ['postId' => $post->id]) }}" class="post-like-a">Like</a>
</div>
控制器:
$ postId是隐藏的ID div
public function getLike($postId)
{
$post = Post::find($postId);
if (!$post) {
return redirect()->back();
}
if (Auth::user()->hasLikedPost($post)) {
return redirect()->back();
}
$like = $post->likes()->create([]);
Auth::user()->likes()->save($like);
return redirect()->back();
}
答案 0 :(得分:1)
不明智地暴露用户&#39;这样的ID,但如果你真的需要它,Laravel提供了一种处理用户的方法。行动授权。可以使用policies或模型scopes来完成。
或者,您可以忽略这些授权并使用UUID代替ID。 有一个很好的package可以为你处理它。基本上,您只需要向用户添加新字段即可。表
在我的应用程序中,我同时使用它们。
答案 1 :(得分:0)
如果我理解你的问题,这里有一个想法:你可以通过将你的ID与一些服务器端的“密钥”连接并进行散列来隐藏实际的帖子ID。
例如:
在app.php
中添加"post_mask_key" => "super_secret_123456"
...在您的代码中,例如:
$maskedPostId = sha1(\Config::get("app.post_mask_key") . $postId);
然后,与您的视图共享$maskedPostId
,该视图将嵌入到HTML中。用户可以尝试更改它,但是在提交时,您可以轻松地重新生成哈希(因为您知道密钥和ID服务器端)并比较这两者。
注意:这种方法在加密方面很弱,但应足以屏蔽非关键项目,例如帖子ID。