次のPHPスクリプトを検討してください(他の言語でもかまいません。簡単にするためにPHP)を選択しました):
_<?php
echo $_SERVER['HTTP_REFERER'];
?>
_
XSSに対して脆弱ですか?
もちろん、curlを使用してスクリプトにリクエストを送信し、refererを<script>alert(document.cookie)</script>
のようなものに設定できます。ただし、少なくとも一部のブラウザーはリファラーをエンコードしているように見えるため、たとえば次のURLからそのスクリプトにユーザーをリダイレクトするとします。
_http://example.com/<script>alert(document.cookie)</script>
_
ブラウザはリファラーをエンコードし、その結果PHPスクリプトはこれを出力します:
_http://example.com/%3Cscript%3Ealert(document.cookie)%3C/script%3E
_
リファラーをエンコードしないブラウザーはありますか?そうでない場合、それは他の方法で悪用される可能性がありますか?
[〜#〜] rfc [〜#〜]
RFC 1945 -リファラーヘッダーに最初に言及-リファラーをURLエンコードする必要があることを指定:
Referer = "Referer" ":"(absoluteURI | relativeURI)
absoluteURI =スキーム ":"(uchar |予約済み)
[...]
uchar =予約なし|逃れる
予約なし= ALPHA | DIGIT |安全|追加|国の
escape = "%" HEX HEX
予約済み= ";" | "/" | 「?」 | ":" | 「@」| "&" | "=" | 「+」
追加= "!" | "" | 「」| "(" | ")" | 「、」
safe = "$" | 「-」| 「_」| 「」
unsafe = CTL | SP | <"> |"# "|"% "|" <"|"> "
7231のような最新のRFCは相互参照が多いため、読みにくいですが、このルールを変更したようには見えません。
そう <
、>
、"
関連するRFCに従って、URLエンコードする必要があります。これは常にそうだったので、非常に古いブラウザでもURLエンコードする必要があります。
ご了承ください '
はエンコードする必要がなく、最新のブラウザではエンコードされないため、XSS攻撃に使用される可能性があります(例:<a href='[REFERER]'>go back</a>
)。
実際には
RFCは<
、>
、"
URLエンコードする必要があります。念のため、リファラーを自分でエンコードすることをお勧めします。
ブラウザはRFCに準拠している必要があります。また、ChromeやFirefoxなどの主要なブラウザがこの場合に使用します)が、一部のブラウザでのみ使用できるように、ベストプラクティス(エンコード)を使用することをお勧めします。 't、またはRFCが将来変更される場合(可能性は低いですが)。