0Pricing
Cyber Security Academy · レッスン

入力検証と出力エンコーディング

すべての入力をサーバー側で検証し、適切なコンテキストで出力をエンコードして、インジェクションを防ぎます。

「入力検証と出力エンコーディング」はCoddyKit上の無料Cyber Security Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはCyber Security Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Cyber Security Academyコースには全4レッスンが含まれています。

入力検証が重要な理由

SQL、コマンド、LDAP、XPath などのインジェクション脆弱性は、信頼できない入力がコードとして解釈される場合に発生します。入力検証により、データが処理、保存、または返却される前に、期待される型、長さ、形式に適合していることを確認します。

許可リスト検証と拒否リスト検証

許可リスト(ホワイトリスト)検証は、受け入れ可能なものを定義します。たとえば、英数字のみ、1〜100 の範囲の整数のみ、有効なメール形式のみを許可します。拒否リスト(ブラックリスト)は、既知の悪意ある入力をブロックしようとしますが、常に不完全です。許可リストを優先してください。

サーバー側での検証

クライアント側の検証はユーザー体験を向上させますが、攻撃者はブラウザの開発者ツールや curl を使って簡単に回避できるため、セキュリティ上の効果はありません。必ずサーバー側で検証してください。クライアント側は利便性のための機能であり、サーバー側がセキュリティ制御です。

データ型ごとの入力検証

数値:型と範囲を確認します。文字列:長さと文字セットを確認します。日付:厳密にパースし、範囲を確認します。ファイル:拡張子とマジックバイト/MIME タイプの両方を確認します — 拡張子だけを決して信頼してはいけません。URL:スキーム、ホスト、パスの各要素をパースして検証します。

パラメータ化クエリによる SQLi 防止

データベースに対する入力検証で最も重要なのは、ユーザー入力を SQL に決して連結しないことです。パラメータ化クエリ(プリペアドステートメント)を使用し、ユーザー入力をクエリ文字列に埋め込むのではなく、パラメータとして渡します。

// WRONG:
const q = "SELECT * FROM users WHERE name = '" + name + "'";
// RIGHT:
const q = "SELECT * FROM users WHERE name = $1";
await client.query(q, [name]);

出力エンコーディングのコンテキスト

同じ文字列でも、コンテキストに応じて異なるエンコーディングが必要です。HTML 本文:HTML エンコーディング (< > &)。HTML 属性:HTML 属性エンコーディング。JavaScript:JS エスケープ。URL パラメータ:URL エンコーディング(パーセントエンコーディング)。誤ったエンコーディングを使用すると、攻撃者に悪用される隙が残ります。

XSS 対策としての HTML エンコーディング

ユーザーデータを HTML に直接挿入してはいけません。HTML を自動的にエスケープするテンプレートエンジンまたはライブラリを使用してください。React では、{value} は安全ですが、dangerouslySetInnerHTML はエスケープを回避します。Django では、safe フィルターを明示的に使用しない限り、テンプレートが自動的にエスケープします。

JavaScript コンテキストのエンコーディング

JavaScript にデータを挿入する場合(ユーザーデータで初期化する変数など)、HTML エンコーディングでは不十分です。JSON エンコーディングを使用してください:JSON.stringify(value)。これにより、データが JS 文字列リテラルのコンテキストから抜け出すのを防ぎます。

URL エンコーディング

URL に挿入するユーザー提供データは、encodeURIComponent() (JS) または urllib.parse.quote() (Python) を使用してパーセントエンコードする必要があります。エンコードされていないデータは URL 構造を操作でき、オープンリダイレクトやパストラバーサルにつながる可能性があります。

多層防御としてのコンテンツセキュリティポリシー

CSP は XSS に対する第二の防御線を追加します。nonce を使用する厳格な CSP では、XSS ペイロードが挿入された場合でも、正しい nonce 属性を持たないスクリプトはブラウザが実行を拒否するため、インラインスクリプトの実行を防止できます。

DOM ベース XSS の防止

DOM XSS は、JavaScript が攻撃者に制御されたソース(location.hash、document.URL、cookie)から読み取り、危険なシンク(innerHTML、document.write、eval)に書き込む場合に発生します。静的解析ツールを使用して、ブラウザ API から DOM シンクまでのすべてのデータフローを監査してください。

理解度チェック

クライアント側の検証を実装している場合でも、サーバー側の入力検証が不可欠なのはなぜですか?

まとめ

入力検証(許可リスト、型チェック、長さ制限)と、コンテキストに応じた出力エンコーディング(HTML、JS、URL、SQL のパラメータ化)を組み合わせることが、インジェクション攻撃や XSS 攻撃に対する主要な防御策です。どちらも例外なくサーバー側で適用する必要があります。

よくある質問

「入力検証と出力エンコーディング」レッスンは無料ですか?

はい。「入力検証と出力エンコーディング」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Cyber Security Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Cyber Security Academyコースには全4レッスンが含まれています。

「入力検証と出力エンコーディング」で何を学びますか?

すべての入力をサーバー側で検証し、適切なコンテキストで出力をエンコードして、インジェクションを防ぎます。 ブラウザで直接実行するハンズオンコードでCyber Security Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Cyber Security Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのCyber Security Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。

「入力検証と出力エンコーディング」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このCyber Security Academyレッスンでコードを書いて実行できますか?

はい。すべてのCyber Security Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. 入力検証と出力エンコーディング
  2. 安全な依存関係管理
  3. OWASP ASVS:アプリケーションセキュリティ検証標準
  4. 安全なコードレビューのテクニック
← Cyber Security Academyに戻る