我之前曾问过这个问题,但没有得到准确的答案,因为我知道无法阻止用户使用inspect element
来更改值,但是如果我将表单与{{ csrf_field() }}
一起使用,则用户仍然可以{ {1}},并更改inspect element
的值作为示例。
而且,如某些人所述,要验证数据,这些数据将传递到控制器并在那里进行验证,但是如果控制器收到id
而不是id=2
,这是可以的,那么用户可以从1
更改id
,您对此有什么解决方案?
示例(我正在使用Ajax将数据传递给控制器)
inspect element
答案 0 :(得分:0)
我看到您正在使用Laravel。
正如用户所说,您应该在后端进行验证。
首先,为了安全起见,不显示增量让用户ID (这会使用户容易猜测-例如,用户更改商店ID尝试编辑另一条记录)< / p>
在后端,有几种方法可以进行此验证。
您可以添加Policy,也可以很简单:
获取登录的用户ID,如下所示:
$user_id = Auth::user()->id;
确保user
拥有商店(获取他发送了request
的商店,并检查用户id
是否相同?)取决于您的体系结构。
答案 1 :(得分:0)
如果用户通过inspect元素更改了商店ID,则可以在控制器或中间件中应用如下内容:
if (! in_array($request->store_id, Auth::user()->stores->pluck('id')->toArray()) {
abort('403');
}
熟悉Laravel提供的 Authorization 服务比这更好。
https://laravel.com/docs/5.6/authorization
我建议您写一些门并付诸行动。那是我和你现在在同一位置时所做的。
这样做,您很快就会意识到,通过检查元素来保护应用程序免受数据篡改是多么可行。
答案 2 :(得分:0)
您可以通过将ID设置为非连续数字来对其进行混淆。
有一个专门用于此方法的 Laravel 软件包:
https://github.com/Propaganistas/Laravel-FakeId
此程序包生成质数而不是随机字符串,这样会更快。
此程序包将对模型的主要ID值进行编码和解码。
使用此软件包时,此过程是自动化的,因为有两个与此相似的软件包,但自动化程度较低: