sg sg-security-measures threat_vulnerability unauthorized_access
まず結論
入力値検証とは、利用者や外部システムから受け取ったデータが、想定した形式・長さ・範囲に収まっているかを確認する対策です。
SG試験では、SQLインジェクション、クロスサイトスクリプティング、バッファーオーバーフローなどを防ぐための基本的な考え方として問われます。
選択肢では、「入力された文字列をそのまま処理する」「長さや形式を確認しない」といった記述があれば注意です。
入力値検証は、外から来たデータを信用せず、使う前に確認するための対策です。
直感的な説明
入力値検証は、受付で「この書類は必要な形式になっていますか?」と確認するようなものです。
たとえば、電話番号の欄に名前が入っていたり、年齢の欄にマイナスの数字が入っていたり、郵便番号の欄に長すぎる文字列が入っていたりすると、後続の処理で問題が起きるかもしれません。
Webアプリでも同じです。
入力欄に、本来想定していない記号、長すぎる文字列、SQL文の一部、不正なスクリプトなどが入ると、脆弱性につながることがあります。
そのため、入力値検証では、受け取ってよいデータかどうかを先に確認することが大切です。
定義・仕組み
入力値検証では、アプリケーションが受け取った値に対して、あらかじめ決めたルールに合っているかを確認します。
代表的な確認項目は次のとおりです。
- 必須項目が入力されているか
- 文字数が上限を超えていないか
- 数値の範囲が正しいか
- メールアドレスや日付などの形式が正しいか
- 許可していない記号や制御文字が含まれていないか
- ファイル形式やファイルサイズが想定どおりか
基本の流れは次のように考えます。
- 入力として受け取る値を決める
- 許可する形式・長さ・範囲を決める
- 入力値がルールに合っているか確認する
- 不正な値は処理せず、エラーとして扱う
- 正常な値だけを後続処理に渡す
特に重要なのは、禁止する値を後から探すより、許可する値を決めるという考え方です。
たとえば、「数字だけ許可」「英数字だけ許可」「選択肢にある値だけ許可」のように、受け取ってよい値を絞ると安全性が高くなります。
IPAの「安全なウェブサイトの作り方」では、SQLインジェクション対策としてSQL文の組立てにプレースホルダを使うことや、クロスサイトスクリプティング対策として出力時のエスケープ処理を行うことなどが示されています。入力値検証は、これらの対策とあわせて考える基本対策です。
参考:IPA 安全なウェブサイトの作り方
SG試験では、入力値検証だけで全ての攻撃を防げると考えず、入力時の確認、処理時の安全な実装、出力時のエスケープを組み合わせると押さえるとよいです。
どんな場面で使う?
入力値検証は、外部からデータを受け取るほぼすべての場面で使います。
たとえば、次のような場面です。
- Webフォームの入力欄
- ログイン画面
- 検索フォーム
- ファイルアップロード機能
- APIで受け取るリクエスト
- 外部システムから連携されるデータ
業務では、「社内システムだから安全」「ログイン後の利用者だから安全」と考えないことが大切です。
入力元が利用者でも、外部システムでも、ファイルでも、アプリケーションに入ってくるデータは検証するという考え方が基本です。
選択肢では、次の表現があれば入力値検証を疑います。
- 入力データの形式を確認する
- 入力文字数の上限を確認する
- 許可された文字だけを受け付ける
- 数値の範囲を確認する
- 不正な入力を処理対象から除外する
一方で、「画面に表示するときに特殊文字を変換する」とあればエスケープ処理、「本人であることを確認する」とあれば認証、「権限があるか確認する」とあれば認可を考えます。
よくある誤解・混同
エスケープ処理との違い
エスケープ処理は、特別な意味を持つ文字を、別の安全な表現に変換する処理です。
たとえば、HTMLでは「<」や「>」がタグとして解釈されることがあります。
そのため、画面に表示するときには、これらを安全な文字表現に変換します。
- 入力値検証:入力された値がルールに合っているか確認する
- エスケープ処理:出力や処理の場面で危険な意味を持たないように変換する
SG試験では、「入力時に形式や長さを確認する」なら入力値検証、「表示時に特殊文字を変換する」ならエスケープ処理と切り分けます。
サニタイジングとの違い
サニタイジングは、一般に危険な文字や不要な文字を取り除いたり無害化したりする処理として使われます。
ただし、試験では用語の細かい定義よりも、何をしているかを見ます。
- ルールに合わない入力を拒否する:入力値検証
- 危険な文字を取り除く・無害化する:サニタイジング
- 出力先に合わせて特殊文字を変換する:エスケープ処理
「入力を受け付けるかどうかの確認」なのか、「値を変換して使う」のかで判断しましょう。
認証・認可との違い
認証は、利用者が本人かを確認することです。
認可は、その利用者に操作権限があるかを確認することです。
入力値検証は、利用者そのものではなく、入力されたデータの中身を確認します。
- 認証:あなたは誰ですか
- 認可:その操作をしてよいですか
- 入力値検証:そのデータは正しい形式ですか
SG試験では、「本人確認」「権限確認」「データの形式確認」を分けて読むと、選択肢を切りやすくなります。
入力値検証だけで十分という誤解
入力値検証は重要ですが、それだけでSQLインジェクションやXSSを完全に防げるとは限りません。
たとえば、SQLインジェクション対策では、入力値を確認するだけでなく、プレースホルダを使ってSQL文を安全に組み立てることが重要です。
XSS対策では、入力値を確認するだけでなく、画面に出力するときのエスケープ処理が重要です。
つまり、入力値検証は基本対策ですが、攻撃の種類に応じた専用の対策と組み合わせる必要があります。
まとめ(試験直前用)
- 入力値検証は、受け取ったデータの形式・長さ・範囲を確認する対策
- 「外から来たデータをそのまま信用しない」が基本
- 入力時に確認するなら入力値検証
- 表示時に特殊文字を変換するならエスケープ処理
- 本人確認は認証、権限確認は認可
🔗 関連記事
- アクセス制御モデルとは?RBAC・ABAC・DAC・MACの違いを整理【SG試験】
- 入退室管理とは?物理アクセス制御の基本【SG試験】
- アクセス管理とは?特権IDとneed-to-knowで権限を適切に制御【SG試験】
- AESとは?鍵長とラウンド数も押さえる共通鍵暗号【SG試験】
- アンチパスバックとは?不正な入退室を防ぐ仕組み【SG試験】