我不确定在对帖子发表评论时是否理解“隐藏”属性。我写了下面的代码,以将评论“瞄准”对post_id
<input type="hidden" name="post_id" value="{{$post->id}}" >
其他人似乎也使用这种“隐藏”方法来查找post_id。问题是,当我检查元素并在值中写“ 3”时,它使我可以在完全不同的博客文章上发表评论。
是否有某种方法可以验证post_id或使其无法使用“检查元素”。
这是commentStore控制器的样子
public function storeComment(request $request)
{
$post = $request->post_id;
$id = Auth::id();
Comment::create([
'body' => $request->body,
'user_id' => $id,
'post_id' => $post
]);
return redirect('/');
}
答案 0 :(得分:4)
如果用户只能在某些帖子上发表评论,请use an authorization policy授权请求,并仅在应允许的地方允许他们的评论。
如果用户应该可以在任何地方发布 ,请不必担心。在那种情况下,用户并没有真正做不该做的事。
答案 1 :(得分:1)
我已经阅读了@ceejayoz
的答案,看起来不错
但是,如果您的应用程序规模很小,并且您不需要实施authorization
策略,则可以这样
hidden attribute
中的问题
用户可以使用view::source
来读取它,甚至可以inspect
并rewrite
来访问该页面
解决方案
我们在做什么
在表单的隐藏属性和post_id
中加密decrypting it the controller
有关加密文档,请参考https://laravel.com/docs/5.8/encryption
按照步骤
观看次数
来自
<input type="hidden" name="post_id" value="{{$post->id}}" >
收件人
<input type="hidden" name="post_id" value="{{Crypt::encrypt($post->id)}}" >
现在post_id
的格式已加密
控制器
将此名称空间添加到控制器顶部
use Illuminate\Support\Facades\Crypt;
use Illuminate\Contracts\Encryption\DecryptException;
将此功能添加到您的控制器
public function decryptId($encryptedId='',$message='Not Found',$statusCode=404)
{
try {
$decrypted =Crypt::decrypt($encryptedId);
return $decrypted;
} catch (DecryptException $e)
{
abort($statusCode,$message);
}
}
和您的storeComment
public function storeComment(request $request)
{
$postIdEncrypted = $request->post_id;
$postIdDecrypted = self::decryptId($postIdEncrypted);
$post = $postIdDecrypted;
$id = Auth::id();
Comment::create([
'body' => $request->body,
'user_id' => $id,
'post_id' => $post
]);
return redirect('/');
}
希望有帮助