Laravel中的隐藏字段

时间:2019-03-21 21:51:10

标签: laravel eloquent

我不确定在对帖子发表评论时是否理解“隐藏”属性。我写了下面的代码,以将评论“瞄准”对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('/');
}

2 个答案:

答案 0 :(得分:4)

如果用户只能在某些帖子上发表评论,请use an authorization policy授权请求,并仅在应允许的地方允许他们的评论。

如果用户应该可以在任何地方发布 ,请不必担心。在那种情况下,用户并没有真正做不该做的事。

答案 1 :(得分:1)

我已经阅读了@ceejayoz的答案,看起来不错

但是,如果您的应用程序规模很小,并且您不需要实施authorization策略,则可以这样

hidden attribute中的问题

用户可以使用view::source来读取它,甚至可以inspectrewrite来访问该页面

解决方案

我们在做什么

在表单的隐藏属性和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('/');
}

希望有帮助