railsのスラッシュスラッシュ(//)ルーティングの挙動には気をつけよう
railsのルーティング処理では、//secret
というパスへのアクセスを、/secret
のルーティングとして処理してくれるそうです。
例えば、/secret
は一般の人にはアクセスして欲しくない特別なページなので、プロキシなどを rails サーバの前において、/secret
のパスでアクセスを受けたらBasic認証などを求めるように設定しているシステムがあるとします。
(user) ----> (プロキシ・L7バランサなど) ----> (rails サーバ)
この状態で、ユーザが /secret
のパスでリクエストをすると、設定の通りBasic認証を求められて正しいクレデンシャルを入力しないと /secret
のコンテンツは取得できません。
しかし、ここでもし、ユーザが //secret
のパスでリクエストを投げると、、、プロキシやL7バランサの設定にもよりますが、プロキシ・L7バランサをすり抜けてBasic認証は求められず、railsに//secret
というパスのアクセスが渡り、/secret
のルーティング処理が実行されて、特別なページのコンテンツを返してしまう可能性があります😱
10個ぐらいrailsサイトがあれば、1個ぐらいは//ルーティングで認証回避できてしまうものもあるかもしれません。 railsの前段に認証処理を置いている場合は回避できるようなパスが存在しないか気をつけて設定しましょう。