ブログサービスの運営経験はないため、一般的な場合についてのみです。
ひととおりカバーした上で、細部・具体値や専門外の内容については続く方にお願いすることとします(笑)
すでにご存知の内容ばかりでしたらゴメンナサイ。
まずは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;
許可リストの内容は専門外であり、ポリシーやページ表現方法によって異なりもするため適当です。
ブログサービスの運営経験はないため、一般的な場合についてのみです。
ひととおりカバーした上で、細部・具体値や専門外の内容については続く方にお願いすることとします(笑)
すでにご存知の内容ばかりでしたらゴメンナサイ。
まずは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;
許可リストの内容は専門外であり、ポリシーやページ表現方法によって異なりもするため適当です。