web-dev-qa-db-ja.com

エンコードされていないHTTPリファラーヘッダーの表示はXSSに対して脆弱ですか?

次の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が将来変更される場合(可能性は低いですが)。

4
tim