2017-12-27 353 views
4

不完全有信心我已经理解了Laravel形式的安全性。例如,如果表单包含 <input type="hidden" name="user_id"> 那么显然黑客可以在提交更新之前更改该值。 虽然我在CSRF看了here,但我还没有完全理解这是否足够的保护?Laravel 5/Form安全(需要澄清)

E.g.考虑到上述情况,如果我访问网站并打开表单以编辑记录,我可以查看但不能更改,并恶意更改“user_id”,表单是否受{{ csrf_field() }}保护或我必须雇用一些进一步的安全性,如Crypt::encrypt($id)隐藏user_id(保存在数据库中)和Crypt::decrypt($id)

在客户端浏览器中显示行标识(如用户标识)是否被认为是不良做法(即使所有内容都是通过https发送的)?

很多谢谢

+0

csrf并没有真正帮助您提及的特定情况。你想要做的是检查后端是否正在发送的ID是否与您所期望的相同。 您也可以对该用户标识进行编码,然后在后端对其进行解码。 全部取决于你实际想要达到的目标吗? – matiit

+0

在这里,https://www.owasp.org/index.php/Cross-Site_Request_Forgery_(CSRF)阅读了解csrf是什么以及csrf令牌会为你辩护。 – matiit

+0

如果'user_id'字段不会被用户*和*在表单中看不到,为什么发送给客户端?将'user_id'服务器端放在SESSION上,而不是客户端上。 – ThoriumBR

回答

2

不,在这种情况下仅使用CSRF令牌是不够的。您还需要使用策略,警卫和中间件来保护您的应用程序。

在这种情况下,一个人可以改变user_id如果从形式阅读后使用,所以你需要使用策略这样一个保护数据(本例中是from the docs):

public function update(User $user, Post $post) 
{ 
    return $user->id === $post->user_id; 
} 

此外,当您需要使用用户ID时,如果需要整个对象,请始终使用auth()->id()auth()->user()。切勿从表单中读取用户ID。

+0

谢谢阿列克谢。我确实有一个中间件,在控制器中我检查编辑这个变更的人有一个管理员角色并且属于同一个公司(他们也不会看到记录,如果他们没有与编辑人员相同的公司ID - 虽然还不够)。 – KevinY

2

Laravel框架存储此CSRF字段的值,如会话变量,并在您提交时与其匹配。

当您提交表单时,Laravel会检查存储的会话值中的值。如果有一个不匹配错误被抛出! :)

2

CSRF令牌保护网站免受跨站请求,意味着外部用户不能复制表单并发送帖子请求。 Laravel使用csrf_field()或Session :: token()函数创建一个随机会话令牌,我们将其放置在隐藏字段中。在处理表单之前,Laravel使用表单中的隐藏字段值来检查会话。