不完全な正規表現による検証の回避

不完全な正規表現による検証の回避

説明

ドメインやホスト名の検証で点(.)をエスケープしなかったり、照合の境界が不十分だったりすると、意図しないホストを許可する可能性があります。

想定される影響

  • SSRF、オープンリダイレクト、外部コールバックの許可リストの回避につながるおそれがあります。
  • 信頼しないドメインを、正規のドメインとして検証に通される可能性があります。

対処方法

  • ドメインの区切りの点は正規表現で \. と記述してください。Goの二重引用符付き文字列では \\. と書きます。
  • 可能ならURLを解析し、ホストを完全一致の許可リストと比較してください。

例

変更前

go
ok, _ := regexp.MatchString("^api.example.com$", host)

変更後

go
ok, _ := regexp.MatchString("^api\\.example\\.com$", host)

解説:

  • 変更前: ホスト名やドメインの点をエスケープしないと、意図したドメインよりはるかに広い入力を許可する場合があります。
  • 変更後: Goの通常の文字列で \\. と書くと、正規表現には点そのものを表す \. が渡されます。先頭と末尾のアンカーでホスト名全体を比較します。

参考資料