JavaScript Tips | セキュリティ:URLパラメータの入力検証

JavaScript JavaScript
スポンサーリンク
スポンサーリンク
  1. URLパラメータの入力検証は「外部から渡される値に“権限”を渡しすぎないための基本設計」です
  2. URLパラメータが危険になりうる具体例をイメージする
    1. 例1:タブ切り替えにURLパラメータを使う
    2. 例2:リダイレクト先をURLパラメータで指定する
  3. ステップ1:URLパラメータの「型」と「許可値」を明確にする
    1. よくある型の例
    2. 例:タブ指定パラメータ tab
    3. 例:ページ番号 page
  4. ステップ2:URLパラメータを安全に取得する基本ユーティリティ
    1. 使用例
  5. ステップ3:整数パラメータの検証(ページ番号など)
    1. 整数パラメータ検証ユーティリティ
    2. 使用例:ページ番号 page
  6. ステップ4:列挙値パラメータの検証(タブ名など)
    1. 列挙値パラメータ検証ユーティリティ
    2. 使用例:タブ指定 tab
  7. ステップ5:パス系パラメータの検証(リダイレクト先など)
    1. 安全なパス検証の基本方針
    2. パス検証ユーティリティ
    3. 使用例:リダイレクト先 redirect
  8. ステップ6:真偽値パラメータの検証(フラグなど)
    1. 真偽値検証ユーティリティ
    2. 使用例:デバッグフラグ debug
  9. ステップ7:業務で使える「URLパラメータ入力検証ユーティリティ」まとめ版
    1. 使用例:典型的な画面初期化処理
  10. ステップ8:絶対に避けるべき危険なパターンを明確にしておく
    1. 1. URLパラメータをそのままDOMに入れる
    2. 2. URLパラメータをそのままリダイレクトに使う
    3. 3. URLパラメータをそのままAPIパラメータに渡す
  11. ステップ9:チームで共有するための「URLパラメータ設計ルール」をコードとドキュメントに刻む
    1. コードコメントで明示する
    2. レビュー時のチェックポイント
  12. まとめ:URLパラメータの入力検証は「外部から渡される値に権限を渡しすぎないための、実務的で欠かせない技術」です

URLパラメータの入力検証は「外部から渡される値に“権限”を渡しすぎないための基本設計」です

業務システムでは、URLパラメータを使う場面がとても多いです。

  • ?page=2 のようなページ番号
  • ?id=123 のようなリソースID
  • ?redirect=/dashboard のようなリダイレクト先
  • ?tab=settings のような表示タブ指定

URLパラメータは便利ですが、外部から自由に書き換えられる入力でもあります。 攻撃者は、ブラウザのアドレスバーやリンクを通じて、好きな値を渡すことができます。

そのため、URLパラメータをそのまま信じて使うと、

  • 想定外の画面遷移
  • DOM Injection / XSS
  • Open Redirect
  • 不正なIDアクセス(認可漏れ)

など、さまざまな問題の入り口になります。

ここでは、初心者向けに、

  • なぜURLパラメータの入力検証が必要なのか
  • どのようにJavaScriptで検証するか
  • 実務で使えるユーティリティと設計

をステップバイステップで解説していきます。

URLパラメータが危険になりうる具体例をイメージする

例1:タブ切り替えにURLパラメータを使う

const params = new URLSearchParams(location.search);
const tab = params.get("tab"); // "home" や "settings" を想定

showTab(tab); // 検証なしで使用
JSX

攻撃者は次のようなURLを作れます。

https://example.com/app?tab=<script>alert('XSS')</script>

showTab の中で innerHTML などを使っていた場合、 この tab 値がそのままDOMに注入されてしまい、XSSが成立する可能性があります。

例2:リダイレクト先をURLパラメータで指定する

const params = new URLSearchParams(location.search);
const redirect = params.get("redirect");

if (redirect) {
  location.href = redirect; // 検証なしでリダイレクト
}
JSX

攻撃者は次のようなURLを作れます。

https://example.com/login?redirect=https://evil.com/phishing

ユーザーは正規サイトにアクセスしたつもりでも、 ログイン後に攻撃サイトへ飛ばされてしまいます(Open Redirect)。

ポイント:URLパラメータは「外部から自由に書き換えられる入力」であり、 検証なしで使うと、攻撃者にシステムの挙動を操作されてしまう可能性がある、ということです。

タイトルとURLをコピーしました