我对Laravel形式的安全性不够了解并不完全自信。例如,如果表单包含
<input type="hidden" name="user_id">
那么显然黑客可以在提交更新之前更改该值。
虽然我在CSRF上看过here,但我还没有完全理解这是否足够保护?
E.g。考虑到上述情况,如果我去一个网站并打开一个表格来编辑我可以查看但不能改变的记录,并恶意改变该用户名,那么表格是否足够受{{ csrf_field() }}
保护,或者我是否必须使用Crypt::encrypt($id)
之类的其他安全措施来隐藏user_id(保存在数据库中)和Crypt::decrypt($id)
?
在客户端浏览器中公开行ID(如用户ID)被认为是不好的做法(即使所有内容都通过https发送)?
非常感谢
答案 0 :(得分: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。
答案 1 :(得分:2)
Laravel框架将此CSRF字段的值存储为会话变量,并在您提交时将其匹配。
当您提交表单时,Laravel会检查存储的会话值中的值。如果出现不匹配,则会引发错误! :)
答案 2 :(得分:2)
CSRF令牌保护站点免受跨站点请求的影响,这意味着外部用户无法复制表单并发送帖子请求。 Laravel创建一个随机会话令牌,我们使用csrf_field()或Session :: token()函数将其置于隐藏字段中。在处理表单之前,Laravel会使用表单中的隐藏字段值检查会话。