php - 修复 Laravel 表单数组验证递归限制

标签 php laravel validation laravel-validation

Laravel 表单验证很棒,只是在使用数组表示法时它不会过滤掉无关的键。

我正在 Controller 中输入提示表单请求。

public function saveEdit(Post\EditRequest $request)
{
    $valid = $request->validated();
}

如果我的表单有 address_1address_2,并且用户欺骗了 address_3,则欺骗的值将不会出现在 $ 中有效

但是,如果我的表单使用数组表示法,例如 venue[address_1]venue[address_2],则用户可以欺骗 venue[address_3 ],它将出现在 $valid 中。

还有人遇到过这种情况吗?你是怎么处理的?

表单请求类上的validated()方法似乎需要递归操作。

最佳答案

不幸的是,Laravel 还不包含对验证数组的内置支持,仅支持数组。为此,我们需要添加 custom validation rules

但是,使用 $fillable 模型属性和 array_only() 辅助函数等替代保护,对于极不可能的边缘情况,创建这些规则需要大量额外工作。我们针对预期用户错误提供验证反馈,并清理以保护我们的数据免受意外输入的影响。

如果用户欺骗了一个 key ,只要我们不保存它,或者将其过滤掉,如果他们没有看到漂亮的验证消息,他们就不会太担心 - 这是没有意义的验证一个本来就不应该存在的字段。

为了说明清理的工作原理,这里有一个声明其可填充属性的 Venue 模型:

class Venue extends Model 
{
    protected $fillable = [ 'address_1', 'address_2' ]; 
    ...
}

现在,如果恶意用户尝试欺骗数组中的另一个属性:

<input name="venue[address_1]" value="...">
<input name="venue[address_2]" value="...">
<input name="venue[address_3]" value="spoof!">

...我们直接使用输入数组来更新模型:

public function update(Request $request, $venueId)
{
    $venue = Venue::find($venueId); 
    $venue->update($request->venue);
    ...
}

...模型将从输入数组中删除额外的 address_3 元素,因为我们从未将其声明为可填充字段。换句话说,模型净化了输入。

在某些情况下,我们可能需要简单地清理数组元素而不使用 Eloquent 模型。我们可以使用 array_only() 函数(或 Arr:only())来执行此操作:

$venueAddress = array_only($request->venue, [ 'address_1', 'address_2' ]);

关于php - 修复 Laravel 表单数组验证递归限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47646524/

相关文章:

php - Laravel 从 mysql 获取标签

php - 如何在导入CSV文件到MySQL数据库中设置字符集?

php - 是否可以在未经身份验证的路由上使用 Auth::user() ?

django - 在没有太多复制/粘贴的情况下很好地重定向错误?

asp.net-mvc - 始终显示验证错误

php - 讨论 MySQL 数据库结构

php - MYSQL/PHP 我可以在哪里插入

javascript - 拉维尔 5 : Updating Multiple Records

session - Laravel 多域 session

xml - 如何修复 soapenv :Envelope issue in XSD schema while validating with SOAP request/response