XSS対策における < > の使用方法と、幾つかの質問 - PHPプロ!Q&A掲示板
4253
- 0P
- 0P
XSS対策における < > の使用方法と、幾つかの質問
質問日時 / 2014年2月26日 15:23 (最終編集:2月27日 04:28) 回答数 / 10件
Questioner: gogoyangii
Tweet
XSS対策における < > の使用方法と、幾つかの質問
一文加筆しました。
以下の質問についてご回答いただきますようお願いいたします。
前説が長いのですが、宜しくお願いいたします。
********前説始まり*********
PHPスクリプトで掲示板を作るとき、外部から入力された文字列に以下のようなコード(コード1)があるとします。
ご存じのように、<a>タグのリンクをURLデコードすると
結果は、セッションネームとIDが表示されます。
対策としては、サイト外部から受け取るクエリーには関数htmlspecialcharsを使用して、HTMLエンティティーに変換しタグとしての機能を無効にし、文字列として受け取り、掲示板に表示します。
この場合コード1は以下のコード2に変換されています。
↓↓↓
これで、掲示板に表示しても、ただの文字列として扱われ、<a>タグなどは機能せず問題なく扱うことができます。
当たり前のことを書くなと怒られそうですがご容赦ください。
******前説ここまで******
本題です。
少し掲示板の機能を増やして、外部から入力された文字列にルールを決めて、ハイパーリンクを表示できるように設定しようとしました。
例えば、以下のような形(コード3)です。
(遷移先と遷移元のページは同一ページで行っています。
この場合、遷移元 seven01.xxx/index.php → 遷移先 seven01.xxx/index.phpとなります。)
↓↓↓
コード3の形式で入力された場合は、string(掲示板表示用)に隣のURLをハイパーリンクとして設定することとします。
以下のコード4を例とします。
↓↓↓
これをそのままリンクを設定して表示すると、コード1と同じ表示になりますので、掲示板に表示されるコードは以下の通りです。
これでは問題ですので、事前にHTMLエンティティーに変換します。
この時、URLデコードも行い %3c→< %3e→>に変換します。
変換した後のコードはコード5になります。
問題ないように思うのですが、リンクにマウスのカーソルをあわせると以下のように表示され、クリックするとダイアログが表示されます。
前説のような、セキュリティー対策についての解説はネットやPHP及びセキュリティーの参考書には多いのですが、本題のようなケースは余り見受けません。
以下、質問とお願いです。
*******質問とお願い******
質問1
本題のような例が、なぜ発生するか詳しくご存じであれば、解説をお願いします。
質問2
対策方法のご教示ください。
質問3
本題のような例が発生するブラウザの種類およびバージョンの一覧がわかれば助かります。
お願い
このような質問が、この「PHPプロ」のテーマからは、質問内容の幅が広く、私が欲張っているように思うのですが、初心者の人間からするとサイト構築中に流してしまい、問題に気づかないままセキュリティーホールを作成してしまう内容であると思います。
皆様何卒ご検討のほど宜しくお願いいたします。
一文加筆しました。
以下の質問についてご回答いただきますようお願いいたします。
前説が長いのですが、宜しくお願いいたします。
********前説始まり*********
PHPスクリプトで掲示板を作るとき、外部から入力された文字列に以下のようなコード(コード1)があるとします。
- コード1
- <a href="http://www.seven01.xxx/?message=%3cscript%3ealert(document.cookie);%3c/script%3e">これは生スクリプトです</a>
ご存じのように、<a>タグのリンクをURLデコードすると
- http://www.seven01.xxx/?message=<script>alert(document.cookie);</script>
結果は、セッションネームとIDが表示されます。
対策としては、サイト外部から受け取るクエリーには関数htmlspecialcharsを使用して、HTMLエンティティーに変換しタグとしての機能を無効にし、文字列として受け取り、掲示板に表示します。
この場合コード1は以下のコード2に変換されています。
↓↓↓
- コード2
- <a href="http://www.seven01.xxx/?message=<script>ealert(document.cookie);</script>">これは生スクリプトです</a>
これで、掲示板に表示しても、ただの文字列として扱われ、<a>タグなどは機能せず問題なく扱うことができます。
当たり前のことを書くなと怒られそうですがご容赦ください。
******前説ここまで******
本題です。
少し掲示板の機能を増やして、外部から入力された文字列にルールを決めて、ハイパーリンクを表示できるように設定しようとしました。
例えば、以下のような形(コード3)です。
(遷移先と遷移元のページは同一ページで行っています。
この場合、遷移元 seven01.xxx/index.php → 遷移先 seven01.xxx/index.phpとなります。)
↓↓↓
- コード3
- [string(掲示板表示用)[URL(リンク設定用)]]
コード3の形式で入力された場合は、string(掲示板表示用)に隣のURLをハイパーリンクとして設定することとします。
以下のコード4を例とします。
↓↓↓
- コード4
- [http://www.seven01.xxx/?message=%3cscript%3ealert(document.cookie);%3c/script%3e[これは生スクリプトです]]
これをそのままリンクを設定して表示すると、コード1と同じ表示になりますので、掲示板に表示されるコードは以下の通りです。
- <a href="http://www.seven01.xxx/?message=%3cscript%3ealert(document.cookie);%3c/script%3e">これは生スクリプトです</a>
これでは問題ですので、事前にHTMLエンティティーに変換します。
この時、URLデコードも行い %3c→< %3e→>に変換します。
変換した後のコードはコード5になります。
- コード5
- <a href="http://www.seven01.xxx/?message=<script>alert(document.cookie);</script>">これは生スクリプトです</a>
問題ないように思うのですが、リンクにマウスのカーソルをあわせると以下のように表示され、クリックするとダイアログが表示されます。
- http://www.seven01.xxx/?message=<script>alert(document.cookie);</script>
前説のような、セキュリティー対策についての解説はネットやPHP及びセキュリティーの参考書には多いのですが、本題のようなケースは余り見受けません。
以下、質問とお願いです。
*******質問とお願い******
質問1
本題のような例が、なぜ発生するか詳しくご存じであれば、解説をお願いします。
質問2
対策方法のご教示ください。
質問3
本題のような例が発生するブラウザの種類およびバージョンの一覧がわかれば助かります。
お願い
このような質問が、この「PHPプロ」のテーマからは、質問内容の幅が広く、私が欲張っているように思うのですが、初心者の人間からするとサイト構築中に流してしまい、問題に気づかないままセキュリティーホールを作成してしまう内容であると思います。
皆様何卒ご検討のほど宜しくお願いいたします。
この質問への意見の募集は締め切られ、ポイントは既に配分されました。
意見を投稿することはできますが、ポイントを受け取ることはできません。
alice4work様 shimix様 ご回答ありがとうございます。掲示板サイトを作る上で重要なトピックです。IPアドレスの解読を防ぐためにソルトを付加する点がポイントですね。