laravel使用带有except方法的验证请求

cmssoen2  于 2023-01-27  发布在  其他
关注(0)|答案(2)|浏览(268)

我将请求验证用作

php artisan make:request ClientRequest

如您所见,在客户端编辑表单上,如果密码字段不为空,我可以使用**$request-〉validated()方法更新数据库,
但是,如果密码字段为空(用户不想更改密码),
我无法使用
$request-〉except('password')-〉validated()方法。
由于这种情况,我使用了
$request-〉except()**方法。
这是否会造成安全问题?

public function update(ClientRequest $request, Client $client)
{

    $validated = $request->validated();

    if($request->filled('password') )
    {
        Client::whereId($client->id)->update($validated);
    }else{
        Client::whereId($client->id)->update($request->except('password'));
    }

    return redirect('/clients')->with('success', 'success');
}
cwxwcias

cwxwcias1#

Client::whereId($client->id)->update($request->except('password'));

这一行确实带来了一个很大的安全问题,特别是当您依赖验证来设置字段而不是fillable属性时。$request->except('password')将返回用户提交的所有其他字段,因此如果用户在请求中添加了类似is_admin => true的内容,您最终将在数据库上设置它(如果它存在)。
您可以对验证过的数据使用\Illuminate\Support\Arr::except(),以确保您只获得所需的数据。

Client::whereId($client->id)->update(\Illuminate\Support\Arr::except($request->validated(), 'password'));

**PS:**您已经通过路由模型绑定了客户端,因此不需要查询它,您可以直接更新该客户端,即

$client->update(\Illuminate\Support\Arr::except($request->validated(), 'password'));
83qze16e

83qze16e2#

在这两种情况下,您都在验证发送到update()的所有字段。
如果您在两种情况下都发送了 password 字段,但只在其中一种情况下验证了它,那么您就会遇到问题。
所以从这个Angular 看我觉得很好。

相关问题