バリデーション
Validation
概要(サマリー)
バリデーションとは、入力されたデータや処理対象の値が、決められた条件や形式に合っているかを確認することである。
たとえば、メールアドレス欄にメール形式の文字列が入っているか、必須項目が空ではないか、年齢欄に数字が入っているか、パスワードが一定以上の長さか、などをチェックする。フォーム送信、会員登録、ログイン、API通信、管理画面などでよく使われる。初心者向けには、「送られてきたデータを、そのまま信じずに確認する門番」のようなものだと考えるとわかりやすい。
詳細解説
バリデーションは「データがルールに合っているか確認すること」である
Webサイトやアプリでは、ユーザーや外部システムからさまざまなデータが送られてくる。
しかし、そのデータが常に正しいとは限らない。
たとえば、次のような入力が来ることがある。
- 必須項目が空のまま送信される
- メールアドレス欄に普通の文章が入っている
- 数字欄に文字列が入っている
- 日付として成立しない値が入っている
- 文字数が長すぎる
- 許可していない制御文字や危険な入力が含まれている
こうしたデータをそのまま処理すると、エラーや不具合、セキュリティ上の問題につながることがある。
そこで、処理に進む前に「このデータは使ってよい形か」を確認する。
これがバリデーションである。
なぜバリデーションが必要なのか
バリデーションが必要な理由は、主に3つある。
1つ目は、ユーザーの入力ミスを防ぐためである。
メールアドレスの形式が間違っていれば、登録確認メールや問い合わせ返信が届かない可能性がある。
2つ目は、システムのエラーを防ぐためである。
数値を想定している場所に文字列が入ると、計算処理やデータベース保存でエラーになることがある。
3つ目は、セキュリティを守るためである。
悪意のある入力がそのまま処理されると、XSSやSQLインジェクションなどの攻撃につながることがある。
ただし、入力検証は防御の一部であり、それだけで攻撃を完全に防げるわけではない。XSSには表示時のエスケープ、SQLインジェクションにはプレースホルダやパラメータ化クエリの利用など、バリデーションとは別の対策も必要である。
つまりバリデーションは、単なる入力チェックではなく、ユーザー体験、システム安定性、セキュリティに関わる重要な処理である。
フォームでよく使われるバリデーション
バリデーションは、フォームで特によく使われる。
たとえば、問い合わせフォームなら次のようなチェックが考えられる。
- 氏名が入力されているか
- メールアドレスが入力されているか
- メールアドレスの形式が正しいか
- 電話番号に使えない文字が入っていないか
- 問い合わせ内容が空ではないか
- 同意チェックボックスにチェックが入っているか
会員登録フォームなら、さらに次のようなチェックが加わることもある。
- パスワードが一定以上の長さか
- パスワード確認欄と一致しているか
- すでに登録済みのメールアドレスではないか
- ユーザー名に使えない文字が含まれていないか
このように、バリデーションは「正しく入力してもらうための確認作業」として使われる。
クライアント側バリデーションとは何か
クライアント側バリデーションとは、ブラウザやアプリ側で行う入力チェックである。
たとえば、HTMLやJavaScriptを使って、フォーム送信前にエラーを表示する。
HTMLだけでも、簡単なバリデーションができる。
<input type="email" required>
この例では、空欄を防ぐ required と、メール形式をチェックしやすい type="email" を使っている。
HTMLのフォーム検証はユーザーの入力ミスを減らす補助として便利だが、サーバー側の検証の代わりにはならない。
JavaScriptを使えば、さらに細かいチェックもできる。
const email = document.querySelector("#email").value;
if (!email.includes("@")) {
alert("メールアドレスの形式を確認してください");
}
このJavaScript例は仕組みを理解するための簡略例であり、実務ではHTML標準のフォーム検証、検証ライブラリ、サーバー側バリデーションを組み合わせて使う。
クライアント側バリデーションは、ユーザーにすぐエラーを伝えられるため便利である。
ただし、これだけで安全とは言えない。
サーバー側バリデーションとは何か
サーバー側バリデーションとは、サーバーで受け取ったデータに対して行うチェックである。
これは非常に重要である。
なぜなら、ブラウザ側のチェックは、ユーザーや攻撃者によって回避される可能性があるからである。
たとえば、JavaScriptを無効化したり、開発者ツールや外部ツールから直接APIへリクエストを送ったりすることができる。
そのため、重要なチェックは必ずサーバー側でも行う必要がある。
たとえば、次のようなチェックである。
- 必須項目があるか
- 型が正しいか
- 文字数が上限以内か
- 許可された値だけか
- 選択肢にない値が送られていないか
- データベース上で重複していないか
初心者向けには、「ブラウザ側のチェックは親切機能、サーバー側のチェックは本番の門番」と考えるとわかりやすい。
APIでのバリデーション
APIでもバリデーションは重要である。
フロントエンドから送られてくるJSONデータや、外部サービスから送られてくるリクエストを、そのまま信用してはいけない。
たとえば、ユーザー作成APIでは次のようなリクエストが来るかもしれない。
{
"name": "Taro",
"email": "taro@example.com",
"age": 25
}
このとき、サーバー側では次のようなチェックが必要になる。
nameが空ではないかemailがメール形式かageが数値かageが不自然な値ではないか- 余計な項目が送られていないか
- 登録済みメールアドレスではないか
APIでは画面が見えない分、エラー時のレスポンスも重要になる。
どの項目が、なぜ不正だったのかを分かりやすく返すと、フロントエンド側でも扱いやすい。
よくあるバリデーションの種類
バリデーションには、さまざまな種類がある。
必須チェック
値が空ではないかを確認する。
名前は必須です
型チェック
数値、文字列、真偽値、配列など、期待する型になっているか確認する。
年齢は数値で入力してください
形式チェック
メールアドレス、電話番号、郵便番号、URLなどの形式を確認する。
メールアドレスの形式が正しくありません
文字数チェック
短すぎる、または長すぎる値を防ぐ。
パスワードは8文字以上で入力してください
範囲チェック
数値や日付が許可された範囲内か確認する。
数量は1〜100の範囲で入力してください
一意性チェック
メールアドレスやユーザーIDなどが、すでに登録されていないか確認する。
このメールアドレスはすでに登録されています
Sanitization / Escape との違い
バリデーションと混同しやすいのが Sanitization である。
- Validation
データがルールに合っているか確認する - Sanitization
データを安全に扱える形へ整える、または危険な要素を取り除く - Escape
表示先の文脈で特別な意味を持つ文字を、文字そのものとして扱われる形に変換する
たとえば、入力欄にHTMLタグが含まれていたとする。
<script>alert("xss")</script>
この入力を「そもそも許可しない」と判断するのがValidationである。
一方、危険なタグを取り除いたり、表示時に無害化したりするのがSanitizationである。
実務では、保存時に取り除くよりも、表示するタイミングでHTMLとして解釈されないようにエスケープすることが重要な場面も多い。
どちらもセキュリティに関係するが、役割は違う。
実務では、ValidationとSanitizationを組み合わせて使うことが多い。
Authentication との違い
Authentication は、日本語では認証と呼ばれる。
バリデーションとは目的が違う。
- Validation
入力データや値が正しい形式か確認する - Authentication
ユーザーが本人かどうか確認する
たとえば、ログインフォームでは次のように両方が関係する。
- メールアドレス形式か確認する → Validation
- メールアドレスとパスワードが本人のものか確認する → Authentication
つまり、バリデーションはデータの妥当性確認であり、認証は本人確認である。
Error Handling との違い
Error Handling は、エラーが起きたときにどう処理するかの考え方である。
- Validation
不正なデータを事前に見つける - Error Handling
問題が起きたときに適切に対応する
たとえば、フォームで入力ミスを見つけてエラーメッセージを表示するのは、バリデーションとエラーハンドリングが関係している。
バリデーションで不正な入力を発見し、その結果をユーザーに分かりやすく伝えるのがエラーハンドリングである。
つまり、Validationは「チェック」、Error Handlingは「問題発生時の対応」と考えると分かりやすい。
バリデーションエラーとは何か
バリデーションエラーとは、入力されたデータがルールに合わなかったときに出るエラーである。
たとえば、次のようなメッセージで表示される。
- メールアドレスを入力してください
- メールアドレスの形式が正しくありません
- パスワードは8文字以上で入力してください
- 数量は1以上で入力してください
- この項目は必須です
良いバリデーションエラーは、ユーザーに「何が問題で、どう直せばよいか」を伝える。
ただ「エラーです」とだけ表示しても、ユーザーは次に何をすればよいか分からない。
バリデーションの設計で大切なこと
バリデーションは、厳しすぎても緩すぎても問題が起こる。
厳しすぎるバリデーション
正しい入力まで弾いてしまうことがある。
たとえば、名前に使える文字を制限しすぎると、外国人名や旧字体が入力できない場合がある。
緩すぎるバリデーション
不正なデータが通ってしまい、エラーや攻撃の原因になることがある。
たとえば、数値が必要な欄に何でも入れられると、計算や保存で問題が起こりやすい。
つまり、バリデーションは「どんなデータなら業務上・システム上受け入れてよいか」を考えて設計する必要がある。
セキュリティ面での注意点
バリデーションはセキュリティ対策の一部として重要である。
ただし、バリデーションだけで完全に安全になるわけではない。
たとえば、次のような対策も合わせて必要になることがある。
特に重要なのは、サーバー側でチェックすることである。
クライアント側のバリデーションだけに頼ると、意図的に回避される可能性がある。
初心者向けの理解の仕方
最初は、バリデーションを「入力されたデータがルールに合っているか確認すること」と覚えれば十分である。
そして、次のように整理すると理解しやすい。
- Validation = 入力チェック
- Client-side Validation = 画面側の親切チェック
- Server-side Validation = サーバー側の本番チェック
- Sanitization = 危険な入力を安全な形に整える処理
- Error Handling = エラー時にどう伝えるか
この関係が分かると、フォーム、API、データ保存、セキュリティの理解がかなり進みやすくなる。
AIコーディングとの関係
AIにフォームやAPIを作らせると、見た目や基本処理はすぐに作れる。
しかし、バリデーションが不十分なコードが生成されることもある。
たとえば、AIが次のようなコードを出すことがある。
- フォーム入力をそのまま送信する
- APIで受け取った値をそのまま保存する
- 必須チェックだけで形式チェックがない
- クライアント側チェックだけでサーバー側チェックがない
- エラー時のメッセージが不親切
- セキュリティ上危険な入力を想定していない
そのため、AIが作ったコードでは「どこで、何を、どの条件でチェックしているか」を確認することが重要である。
バリデーションを理解していると、AIへの指示も具体的になる。
たとえば、次のように依頼できる。
この問い合わせフォームに、クライアント側とサーバー側の両方でバリデーションを追加してください。
必須チェック、メール形式チェック、文字数上限、エラーメッセージ表示も含めてください。
よくある勘違い
クライアント側でエラーが出なければ安全?
そうとは限らない。ブラウザ側のチェックはJavaScriptを無効化したり、開発者ツールやAPIへの直接リクエストで回避されたりする可能性がある。安全性を保証するのは、必ずサーバー側で行うバリデーションである。
バリデーションさえしていれば攻撃を防げる?
バリデーションだけでは不十分である。XSSには表示時のエスケープ、SQLインジェクションにはパラメータ化クエリなど、バリデーションとは別の対策を組み合わせる必要がある。バリデーションは「入り口でおかしなデータを弾く」役割であり、それだけで全ての攻撃を防げるわけではない。
エラーメッセージは「エラーです」で十分?
不十分である。「エラーです」とだけ表示しても、ユーザーは何を直せばよいか分からない。良いバリデーションエラーは、どの項目が、なぜ不正だったのかを具体的に伝える。
まとめ
- バリデーションは、入力されたデータや処理対象の値が、決められた条件や形式に合っているかを確認すること。
- クライアント側バリデーションは親切機能、サーバー側バリデーションは本番の門番と考えると整理しやすい。
- Sanitization(無害化)、Authentication(認証)、Error Handling(エラー対応)とは目的が異なる、混同しやすい概念である。
- 厳しすぎても緩すぎても問題が起きるため、業務・システムの要件に応じた設計が必要である。
- AIが生成したフォームやAPIのコードは、必須チェックだけでサーバー側チェックが抜けていないかを確認する価値がある。
より詳しくAIに聞いてみよう
- バリデーションとは何かを、中学生でもわかるように具体例つきで説明してください。
- Validation と Sanitization と Authentication の違いを、初心者向けに整理してください。
- フォームでよく使うバリデーション項目を、具体例つきで教えてください。
- クライアント側バリデーションとサーバー側バリデーションの違いを教えてください。
- AIにフォームやAPIのバリデーションを実装してもらうときのプロンプト例を作ってください。