2016-04-14 112 views
1

在页面上,用户会有几个帖子。每个帖子都有一个id#来标识在编辑或删除帖子时使用的编号。使用刀片服务器,我可以让隐藏的ID div仅在经过身份验证的用户使用自己的个人资料时才显示(因为只有他们被允许编辑或删除帖子)。Laravel从视图中隐藏Div ID

但是,我也有一个喜欢的功能,也使用该隐藏ID的div。我不希望有人查看页面源,更改ID,然后点击类似按钮。有没有办法在视图中包含ID,但不允许更改ID?

我可以尝试做一些验证,如匹配用户,正文,发布时间和ID,如果不匹配,然后抛出一个错误。好奇的是,如果有更好的方法。

查看:

<div class="post-like"> 
    <a href="{{ route('post.like', ['postId' => $post->id]) }}" class="post-like-a">Like</a> 
</div> 

控制器:

的$帖子ID是隐藏的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

如果我正确理解你的问题,这里有一个想法:你可以通过连接你的ID和一些服务器端唯一的“密钥”和散列来隐藏实际的帖子ID。

例如:

在你app.php你加入类似"post_mask_key" => "super_secret_123456"

...在你的代码,类似:

$maskedPostId = sha1(\Config::get("app.post_mask_key") . $postId);

然后,分享$maskedPostId你的看法,它将被嵌入到HTML中。用户可以尝试更改它,但是当它被提交时,您可以轻松地重新生成哈希(因为您知道密钥和ID服务器端)并比较两者。

注意:这种方法是密码学方面的弱点,但应该足以掩盖诸如帖子ID之类的非关键项目。

+0

当需要诸如用户ID等信息发送给控制器时,典型的最佳实践是什么? –

+0

对于应用程序而言,始终存在一种便利安全性交易。一般来说,屏蔽内部数据库ID可能是一个好主意 - 所以UUID可以工作。您可能还想探索使用[HMAC签名](http://security.stackexchange.com/questions/20129/how-and-when-do-i-use-hmac/20301) – avip

+0

我会研究您的建议。除了他们自己,我可以隐藏用户的ID,所以没关系。需要弄清楚帖子ID的UUID。 –

1

这不是明智的暴露用户的ID这样的,但如果你真的需要它,Laravel提供了一种处理用户行为授权的方法。可以使用policiesscopes

或者,您可以忽略这些授权并使用UUID代替ID。 有一个不错的package为您处理它。基本上你只需要在用户表中添加一个新字段。

在我的应用程序中,我使用了它们两个。