Webアプリケーション開発において、最も重要でありながら、最も軽視されがちな原則があります。
「ユーザー入力を信頼してはならない (Never trust user input)」
これはセキュリティの世界では古典的な教えですが、攻撃手法が高度化した現代でも、依然として多くの脆弱性の根本原因になっています。本記事では、この原則がなぜ重要なのか、どのように実践すべきかを、具体例とともに解説します。
なぜ「ユーザー入力を信頼してはならない」のか
理由はシンプルで、攻撃者も“ユーザー”だからです。
Webアプリケーションは、フォーム、URLパラメータ、Cookie、HTTPヘッダなど、さまざまな経路から入力を受け取ります。これらはすべて、攻撃者が自由に改ざんできます。
つまり、
- 「普通のユーザーはそんなことしないだろう」
- 「UIで制御しているから大丈夫」
- 「JavaScriptでバリデーションしているから安心」
といった考えは、セキュリティの観点では成立しません。
信頼してはいけない入力の例
Webアプリが受け取るデータは、基本的にすべて不正な値が入り得ます。
| 入力経路 | 改ざん可能か | 例 |
|---|---|---|
| URLパラメータ | 可能 |
?id=1 を ?id=1 OR 1=1 に書き換え |
| フォーム入力 | 可能 | hiddenフィールドを任意の値に変更 |
| Cookie | 可能 | ローカルで自由に編集 |
| HTTPヘッダ | 可能 | User-Agent を攻撃コードに変更 |
| JSON / APIリクエスト | 可能 | 任意の構造に書き換え |
「ユーザーが触れないはずの値」ほど危険です。攻撃者はそこを狙います。
信頼した結果、何が起きるのか
1. SQLインジェクション
SELECT * FROM users WHERE id = ${id};
id=1 OR 1=1 を渡されると、全件取得されてしまいます。
2. XSS(クロスサイトスクリプティング)
入力値をエスケープせずにHTMLへ出力すると、
<script>alert('XSS');</script>
のようなスクリプトが実行されます。
3. CSRF
「ユーザーが意図しないリクエスト」を送られることで、勝手に設定変更や購入処理が行われます。
4. パラメータ改ざん
hiddenフィールドや金額情報を改ざんされると、商品価格を勝手に書き換えられることもあります。
どうすれば「信頼しない」を実践できるのか
1. サーバー側で必ずバリデーションする
クライアント側のチェックは“ユーザー体験向上”のためであり、セキュリティ対策ではありません。
2. 入力値をそのまま使わない
- SQL → プレースホルダを使う(プリペアドステートメント)
- HTML → 適切にエスケープして出力
- ファイルパス → ホワイトリスト方式で制御
3. 権限チェックを必ず行う
「URLにアクセスできたらOK」ではなく、
**「そのユーザーがその操作をしてよいか」**を毎回確認する。
4. 外部サービスからのデータも信頼しない
APIレスポンスやWebhookも改ざんされる可能性があります。
「信頼しない」は疑うことではなく、守ること
「ユーザーを信頼してはならない」という言葉は、ユーザーを敵視するという意味ではありません。
むしろ、
“すべてのユーザーを平等に扱い、アプリケーションを安全に保つための姿勢”
と言えます。
セキュリティは「攻撃者との戦い」ではなく、
**「安全な仕組みを淡々と積み上げる作業」**です。
その第一歩が、この原則です。
まとめ
- Webアプリはあらゆる入力が改ざん可能
- 「普通のユーザーはしない」は通用しない
- バリデーション・エスケープ・権限チェックが必須
- 外部サービスも含めて、入力はすべて疑う
この原則を徹底するだけで、多くの脆弱性は未然に防げます。