[PHP-users 8367] Re: 簡易クロスサイトスクリプティング対策スクリプト

Masaru Matsunami php-users@php.gr.jp
Tue, 02 Jul 2002 01:50:41 +0900


こんばんは松並です。
※頻繁にメールを見れないのですみません。

Mon, 01 Jul 2002 10:50:33 +0900 頃に
Yasuo Ohgaki <yohgaki@ohgaki.net> さん wrote:

> > よく < や > といった文字を検出したり、エスケープすればオーケーと
> > 聞きますが、HTML中の文脈によっては、クロスサイトスクリプティング脆弱性
> > につながることがあります。
> > わたしがまとめた情報がこちらにあります。
> 
> ご指摘の通り、単純に< >を検出/エスケープすればOKと言うもの
> ではありません。< >を検出/エスケープすれば大方OKですが、、、

大方オーケーなのですが、掲示板などで自分のホームページアドレスを入力
させる部分は、< や > がなくてもスクリプトを入れ込めるので要注意ですね。

  <A href="javascript:alert('hello');">my page</A>
           ^^^^^^^^^^^^^^^^^^^^^^^^^^
とか。ユーザがクリックしてしまうとスクリプトが起動します。
単純なエスケープ処理では対処できないケースがありますね。
とりあえず応急処置としては

  < や > を対処して、リンク部分を気をつける

といったところでしょうね。リンク部分についてはIPAの記事中の
「URL属性」の個所が参考になるかと思います。


> # printe(): 危険なタグを削除、またはエスケープして出力する
> # 関数。のようなものがあれば便利かも知れませんが、magic_quote
> # の様にこれを使えば安全、と勘違いされるのも困りますし、、
> # どうでしょうか?

HTML中の文脈に依存して、適切なエスケープ方法が異なりますので、
単純にエスケープするのでは回避されてしまうこともあります。
HTML中の文脈に応じて printe のバージョンが揃っていればよいですが、
バージョンの使い分けをプログラマが分かっていなければならず、
これもやはりプログラマにスキルを求めてしまいます。

HTML文脈に応じて適切なエスケープをしてくれるHTMLテンプレートクラス
ってのがあればなぁ、作りたいなぁ、でもHTMLをパースするって大変だよねぇ
などと、1年前くらいから思ってはいます。思うだけですが。


ちょっとそれますが、「HTMLタグ」をユーザ入力として許可している
Webアプリケーションがありますが、
危険なタグを検知し取り去ることは非常に難しいと思います。
ブラウザは機能優先で拡張されますので、(ちょっと偏見)
知らぬ間に危険なタグが増えている可能性があります。
またブラウザのバグで通常のタグが危険タグになるかもしれません。
「HTMLタグ」入力をWebアプリ仕様から排除することを検討すべきだと思います。


> ブラウザ、ヘルパーアプリケーション開発者にはセキュリティーホー
> ルを修正するだけでなく、少なくとも悪意のあるコード、ファイル、
> データがWebサイトから送られてきた場合、注意/警告するくらいの
> 事はやって欲しいですね。(私が知らないだけで実は警告する場合が
> 多い?)

どのスクリプトが危険で、どのスクリプトは安全か、
というのは、ブラウザにとって判断が難しいと思います。
もちろん、人間にとっても難しいのですが・・・
もしかして、よい判断方法ってありますか?

やはり、サーバが生成するHTML中に、外部データを埋め込む場合、
外部データがタグやスクリプトとして動作しないようにするしか、
ないのだろうと思っています。


-- 
Masaru Matsunami <mat@abelia.ocn.ne.jp>