ブログサービスを運営するとき、投稿記事にHTMLのタグをどの程度許すか考えています。いまは厳しめのホワイトリストでやっているのですが、いろんなブログパーツ貼り付けの要望に毎回対応するのが面倒になりました。


MTのコメント投稿の事例やソースは参考になりますが、ブログサービス運営者側で、かつコメントではなくユーザーの記事本文の場合となると、ちと話が違うと思います。
http://www.sixapart.jp/movabletype/manual/3.3/03_blog_admin_guide/customizing_blogs/sanitizing.html

以下の疑問のうち、いくつでもいいので、回答または部分的にでも解説されたURLをお願いします。

1. なんの制限もせずにあらゆるタグ(Javascriptやstyle属性内の外部リソース参照などを含む)許した場合、たとえばどんな危険が考えられるか。
2. ブラックリスト方式が適切かどうか。適切だとしたら、どのようなリストで、正規表現などでどう処理するのがよいか。
3. 2.と同様に、ホワイトリスト方式の場合。
4. 通常の < や > を実体参照化する場合、2.や3.の処理でタグとどう区別すべきか。
5. このような問題を考えるのは、すごく楽しいですね。

回答の条件
  • 1人5回まで
  • 200 ptで終了
  • 登録:2007/07/07 00:10:46
  • 終了:2007/07/14 00:15:03

回答(1件)

すべて
一般的な場合については… calmnite2007/07/09 00:13:43ポイント1pt

ブログサービスの運営経験はないため、一般的な場合についてのみです。

ひととおりカバーした上で、細部・具体値や専門外の内容については続く方にお願いすることとします(笑)

すでにご存知の内容ばかりでしたらゴメンナサイ。

まずは1.につきまして、タグのミスで表示が崩れる、というものはさておき、「危険」なものについては、

・主にサーバに危険が及ぶ可能性

サーバがSSI等を許可している場合、悪意あるユーザがSSIを含むエントリを書き込むと、それを表示する際にサーバ内で「実行」されてしまうこととなり、恐ろしいことにつながります。

ブログならばおおかたPHPだと思われ、PHPは専門外だったりするのですが、悪意あるユーザが書いた内容をブログプログラムが処理する場合に何らかの攻撃を行える可能性もあり、恐ろしいことになるかもしれません。

(少なくともPerlCGIについてはよく知られた方法がいくつかあります)

・主にブラウズに来た人に危険が及ぶ場合

ブラウザがJavaScript等を許可する設定になっている(たいていはなっていますね)場合、悪意あるユーザがJavaScriptを含むエントリを書き込むと、それを表示する際にブラウザで「実行」されてしまうこととなり、恐ろしいことにつながります。

(XSS:クロスサイドスクリプティング、というやつです)

…といったところでしょうか。


2.に関しては、知らないものは防げない、という問題があります。

すべての攻撃方法を熟知されているのであれば、適切な方法かと思います。

3.の場合は、たいていのものは防げるでしょうが、ユーザの自由度はある程度制限されますね。

(一通りの攻撃方法を知っている方がよい、ということに変わりはありません)


これらをふまえた上で、私は以下のようにしています。(perlでの正規表現です)

#SSIぽいのはすべて消す

$hoge =~ s///g;

#実体参照もすべて許さない(ひとつの方法として、&を実体参照にして無力化する)(ここに書かなければ、続く",',>,<を実体参照したものの&まで変換されてすごいことになる)

$hoge =~ s/&/&/g;

#ダブル・シングルクォーテーションを含む内容をタグ中に出力した場合にXSSを許すこととなるので、実体参照にして無力化

$hoge =~ s/\"/"/g;

$hoge =~ s/\'/'/g;

#すべてのタグを禁止(>,<を実体参照にして無力化)

$hoge =~ s/>/>/g;

$hoge =~ s/</</g;</p>

…我ながら臆病者のようです(笑)

なお、入力された値が何に使われるかによって(プログラム中でどこに展開されるか、生成されたHTMLのどこに埋め込まれるか)によって、禁止文字や禁止単語を増やす必要がでることもあります。


4.に関しましては、許可タグのリストを作っておきリストと一致しなければ>,<を実体参照に、あるいは禁止タグのリストを作っておきリストと一致すれば>,<を実体参照に、とするのがシンプルかつ合理的と考えます。

Perlで許可リストを使う場合に用いる書き方の例として、

#まずはすべての>,<を実体参照にした上で、"[<の実体参照] [許可リストのどれか] [スペース] [何か文字列] [>の実体参照]"というパターンについてはタグに戻す(力業になりました><)

#なお、[スペース]がなければ、今回の許可リストに含まれるsがspanあたりにもマッチしてしまいます

$hoge =~ s/>/>/g;

$hoge =~ s/</</g;</p>

$hoge =~ s/<(a|font|b|l|s)\s(.*?)>/<\1\2>/g;

許可リストの内容は専門外であり、ポリシーやページ表現方法によって異なりもするため適当です。

すべて

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません