Server Function のセキュリティで、最も重要な前提はどれですか。
引数を信用しないことです。実体はサーバー上のエンドポイントで、React 公式も「引数は完全にクライアント制御下にある」と明記しています。検証と認可は関数の中で必ず行います。
面接官が見ているのは🔴 ここを外すと本番で穴を開ける。基礎編に入れておく必要がある。
よくある答えと、面談でどう見られるか
- 引数はクライアントが自由に作れるので、関数の中で検証と認可を行う
React 公式が「引数は完全にクライアント制御下にある」と明記しています。 - サーバーで実行されるので、改ざんされる余地はない
実行される場所と入力の信頼性は別です。引数はクライアントが決めています。 - 画面にボタンを出していない操作は呼ばれないので安全
UI に出ていないことは防御になりません。実質エンドポイントなので直接呼べます。 - TypeScript の型を付けておけば不正な値は弾かれる
型はビルド時のもので実行時には残りません。面談で頻出の論点です。
模範解答
引数を信用しないことです。Server Function は結果としてサーバー上のエンドポイントになります。
React の公式は「Server Function の引数は完全にクライアント制御下にある。セキュリティのため、常に信頼できない入力として扱い、検証とエスケープを行うこと」と明記しています。さらに「どの Server Function でも、ログイン中のユーザーがその操作を行ってよいかを検証すること」とも書かれています。
具体的には、deleteItem(id) のような関数で id だけ受け取って消してはいけません。「そのユーザーがその id を消してよいか」を関数の中で必ず確認します。
もう1つ、'use server' をファイル先頭に書くと、そのファイルから export した関数が全部クライアントから呼べるようになります。補助的なつもりの関数を同じファイルに export しないよう気をつけます。