アカウント名:
パスワード:
Apache::Requestモジュールの代わりにApache::TaintRequestモジュールを使えば、フォームのインプットから自動的にや"やその他アヤシゲな文字をエスケープしてくれる
この方法では次の問題が考えられるのではないでしょうか。
問題なのは、クロスサイトスクリプティングのことを考えずに一旦作ってしまったモノに対して、後から緊急に対策をする場合です。入力値に依存しそうなところだけ目を皿にして探して対策するのでは、必ず見落としが出てくるでしょう。そういうときの緊急避難に使えるのが、今回ネタにたれ込まれた方法と言えるかもしれません。がしかし、上に述べたように、必要以上にエスケープしてしまったり、不完全だったりして、使えないのではないでしょうか。
やはり、緊急対策の場合も、すべての文字列出力をエスケープするようにする(タグを出力するところだけ目を皿にして探す)のが妥当のように思えますが、いかがか。
use Apache::TaintRequest; my $apr = Apache::TaintRequest->new(Apache->request); my $text = $apr->param('text'); $r->content_type("text/html"); $r->send_http_header; $r->print("You entered ", $text); $text =~ s/[^A-Za-z0-9 ]//; $r->print("You entered ", $text);
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
あと、僕は馬鹿なことをするのは嫌いですよ (わざとやるとき以外は)。-- Larry Wall
この対処法は本当に使いものになるのか? (スコア:3, すばらしい洞察)
この方法では次の問題が考えられるのではないでしょうか。
- 出力したいタグ文字列に、入力文字列を連結して、変数に入れている場合に、それをprintしようとすると、タグ部分も含めてエスケープされてしまい、正常に動作しなくなる。
- FORMからの入力だけでなく、データベースから取得してきたデータに対してもエスケープが必要だが、それもtaintモードでtaintedと認識されるのか?
私がおすすめする対策は以下のものです。- HTMLにおける文字列出力は、基本は、すべてをエスケープしながらするものと考える。
- 例外的に、タグそのものを出力するときだけ、エスケープしないようにコーディングする。
一から開発するときは、これはけっこう簡単なことだと思います。セキュリティ問題以前に、元々こうするべきことなのですし。問題なのは、クロスサイトスクリプティングのことを考えずに一旦作ってしまったモノに対して、後から緊急に対策をする場合です。入力値に依存しそうなところだけ目を皿にして探して対策するのでは、必ず見落としが出てくるでしょう。そういうときの緊急避難に使えるのが、今回ネタにたれ込まれた方法と言えるかもしれません。がしかし、上に述べたように、必要以上にエスケープしてしまったり、不完全だったりして、使えないのではないでしょうか。
やはり、緊急対策の場合も、すべての文字列出力をエスケープするようにする(タグを出力するところだけ目を皿にして探す)のが妥当のように思えますが、いかがか。
Re:この対処法は本当に使いものになるのか? (スコア:1)
既にデータベースに格納されているものに対しては対策にならない、というのは、その通りです。それはデータベースから引き出す窓口をなるべく少なくして、その部分で除染するとか、そういう対策が必要でしょう。
しかし少なくとも、このモジュールを通しておけばタグはみんなエスケープされる、というものがあれば、その後の設計はかなり楽になると思います。入力はみんな片っ端からそのモジュールを通せばいいわけですから。
あと、当然のことですが、タグだけエスケープしてクロスサイトスクリプティングだけ防げば他の対策は何もしなくていいというわけではないですよね。バッファオーバーフローだって気を付けなきゃいけないし、他にもいろいろありますよね…。
私がこれを紹介したのは、クロスサイトスクリプティング対策の一つとしてこんなのどうですか?というつもりでした。もちろんこれだけでいいというつもりは毛頭ありません。Apache::TaintRequestを使って、かつ出力側でも対策すれば、さらにデータベースの書き込み・読み出しも対策すれば、より心強いのは言うまでもありません。あとからソースコードに手を入れる人がApache::TaintRequestを使わずにApache::Requestを使ってしまう可能性だってあるわけですから。
ちょっと言い訳がましいですが、ワタシの意見としてはこんなところです。
Re:この対処法は本当に使いものになるのか? (スコア:1)
下の方にApache::TaintedRequestそのもののコードがあって、これを見ると、どうやらprintメソッドをオーバーライトして、そこで除染しているようです…失礼しました。
# ちゃんと全部読み直してから反応せい>自分