在页面上,用户将有几个帖子 . 每个帖子都有一个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();
}
2 回答
如果我正确理解你的问题,这里有一个想法:你可以通过将你的ID与一些服务器端的“密钥”和散列连接来隐藏实际的帖子ID .
例如:
在
app.php
中添加类似"post_mask_key" => "super_secret_123456"
的内容...在你的代码中,类似于:
$maskedPostId = sha1(\Config::get("app.post_mask_key") . $postId);
然后,与您的视图共享
$maskedPostId
,该视图将嵌入到HTML中 . 用户可以尝试更改它,但是当提交时,您可以轻松地重新生成哈希(因为您知道密钥和ID服务器端)并比较这两者 .Note: 这种方法在加密方面很弱,但应足以屏蔽像帖子ID这样的非关键项目 .
它's not wise expose users'这样的ID,但如果你真的需要它,Laravel提供了一种处理用户动作授权的方法 . 可以使用policies或模型scopes来完成 .
或者,您可以忽略这些授权并使用UUID代替ID . 有一个很好的package为你处理它 . 基本上你是'll just need to add a new field to the users'表 .
在我的应用程序中,我使用它们 .