🚧

Laravel Livewire の public プロパティの注意点(その1)

2022/03/04に公開

前書き

やや日本では出遅れている感のある Livewire ですが、今後徐々に使われていく予感がします。
という事で、Livewire の public プロパティについての注意点です。

本題

Livewire のコンポーネントでは、public と private/protected のプロパティには、決定的な違いがあります。特に気をつけたい違いとしては、public プロパティは、ユーザー側の手に渡るという点です。

日本語ドキュメントには、「重要な注意点」として、以下のように書いてあります。

「パブリックプロパティに保存したデータは、フロントエンドのJavaScriptで表示可能になります。そのため、機密性の高いデータは保存しないでください。」

機密性の高いデータと表現してあり、ユーザーに見られてはまずいデータは、public に設定してはいけない事が分かります。

ただ、もう少し解釈が必要で、「ユーザー側の手に渡る」以上、一見、機密性が高くないと思えそうなものでも、ユーザーにデータを改変されてはまずいものは、public に指定するとまずいです。

以下のわざとらしい例で見てみます。

<?php

namespace App\Http\Livewire;

use App\Models\Post;
use Livewire\Component;

class PostList extends Component
{
    public $limit = 10;

    public $direction = 'asc';

    public $select = ['id', 'title'];

    public function render()
    {
        return view('livewire.post-list', [
            'posts' => Post::query()
                ->select($this->select)
                ->take($this->limit)
                ->orderBy('id', $this->direction)
                ->get()
        ]);
    }
}

public の特性を理解していないと、ついつい上記のようにやってしまいがちです。流石に、select は無いかも知れませんが😅。

何が問題かと言うと、上記3プロパティとも、ユーザー側で簡単に改変できてしまいます。select を改変すれば、、、、辞めておきます。

これは、Livewire が悪いのではなく、元々そういう仕様ですので、ユーザー側の方で気をつけないといけません。

上記の場合、そもそもプロパティ化しないで直接書くか、又はプロパティにする必要がある場合は、private or protected にすれば回避できます。

(補足:一部オブジェクト系については、public だからと言って簡単に改変できるというものではありません)

以上です。

第2弾もあります。
https://zenn.dev/nshiro/articles/123391f83f3ee6

Livewire の学習をされたい方

宣伝モードですいません。
Livewire の学習をされたい方向けの講座を Udemy で公開しましたので、もしよろしければご覧下さい。なるべく Livewire の中の仕組みが分かるように解説しております。
Laravel Livewire 基礎講座

私の Twitter アカウントで、割引クーポン情報も記載しておりますので、宜しければチェックしてみて下さい。
Twitter shirocake

Discussion