「ログイン後に元のページへ戻す」ために、戻り先の URL をパラメータで受け取る。 そのときの戻り先の検証を、よくある書き方で比べる。このページは判定するだけで、実際には移動しない。
試す URL: 正規(相対パス) 正規(絶対URL) 外部サイト // で始まる /\ で始まる @ の前に lab を置く パスに lab を含める javascript: スキーム
判定する URL: //trap.y-omasa.work/phish/
ブラウザが実際に向かう先: (計算中)
(正規サイトは lab.y-omasa.work)
| 検証のしかた | コード | 判定 | 結果 |
|---|---|---|---|
| 前方一致 | str_starts_with($url, 'https://lab.y-omasa.work') |
弾く | |
| 部分一致 | str_contains($url, 'lab.y-omasa.work') |
弾く | |
| 先頭が / なら相対パスとみなす | str_starts_with($url, '/') |
通す | |
| 先頭が / で、2文字目が / でない | preg_match('#^/[^/]#', $url) |
弾く | |
| parse_url でスキームとホストを比べる | scheme が http/https かつ host が lab.y-omasa.work |
弾く | |
| 相対パスだけ許可(厳密) | preg_match('#^/(?![/\\\\])#', $url) |
弾く | |
| 番号で管理する | ?to=1 → サーバー側の対応表で URL に変換 |
— | URL を受け取らないので、この種の攻撃は成立しない |
@(その前はユーザー名として扱われる)や
//・/\(ブラウザはどちらも「別のホストへ」と解釈する)ですり抜けられる。