如何保护Laravel Livewire公共财产不受操纵?

时间:2020-06-25 14:19:18

标签: laravel laravel-livewire

我正在用对象$form装载组件,我需要在两次请求之间访问该对象。 $form中的数据不是秘密,但不应篡改,因此我想将其设置为protected属性。尽管两次请求之间仅保留public属性,但将其暴露给前端。

如果可能的话,如何防止对该公共财产进行操纵?

我尝试过支票

public function updating($key, $value)
{
    if($key === 'form') return;
}

但我认为这真的没有任何作用。

在我的情况下,使用会话也不是替代选择。

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

我认为您有以下选择:

  1. 不要将数据存储为公共属性,而是将其传递给 render() 方法中的视图

    public function render(){
       return view('Livewire.nameofyourview ', [
          'form' => YourDataSource::get()
       ]);
    } 
    

    这将重新获取与您的组件的每次交互的数据。您可以像以前一样在模板中使用 $form 访问它。 确保删除 $form 作为公共属性。使用此解决方案无法操作来自客户端/用户站点的 $form 数据。 Docs

  2. 使用验证规则,如果您需要您的用户/客户端操作 数据,但仅限于您期望的方式。

    protected $rules = [
        'form.name' => 'required|min:6',
        'form.email' => 'required|email',
    ];
    

    Full Example

  3. 使用 Laravel 缓存 在请求之间保留数据。这种技术 如果您无法从源重新获取数据,则很有用,例如何时 它作为参数 (<livewire:form-component :form="$form">) 传递给您的 Livewire 组件。

    /* Cache the data on component mount */
    public function mount($form)
    {
        Cache::set($this->id."_form", $form, 60*10);
    }
    
    public function someFunction()
    {
        /* read the data form cache, if you need it again */
        cache($this->id."_form");
    }