掲示板のタグは何を禁止したらいいのか

[上に] [前に] [次に]
masa [E-Mail] 2000/03/10(金) 22:51:50
掲示板でよく危険なタグがあるからタグは使えなくしたほうがいいって言うけど、。
危険なタグって何ですか?
そのタグだけ禁止にしたいと思うんですが、
何を禁止にしたほうがいいですか?

andi 2000/03/10(金) 23:46:04
ファイアウォール(セキュリティ)的に考えると、
「何を禁止するか」より「何を許可するか」の方が良いと思います。

まずすべてのタグを禁止し、<b>とか安全そうなタグを
許可するとか。

とし 2000/03/10(金) 23:49:27
初めまして。
禁止するのであれば基本的には
<script></script>、<!-- -->、
<meta>に<table>系タグは禁止しておいた方が
いいのではないでしょうか。

http://www2q.biglobe.ne.jp/~terra/cgi/henteko4.htm
などのようなタグ許可式が確実(それでも完全では
ないらしいですけれど)みたいですがそれはできないのでしょうか?
<style><frame><applet>など禁止した方がいいタグは数多く
ありますから。

とし 2000/03/10(金) 23:50:41
あ、andiさんと重なってしまいましたが
andiさんと同じ意見です。

コウノトリ 2000/03/11(土) 00:08:54
andiさんの発言に<b>が安全だとありますが、style属性をつけられたら<img src="〜.cgi">と同等のセキュリティホールになります。
禁止属性までチェックするとスクリプトも複雑になりますし、負荷もあがります。
イタズラの防止が目的なら「全部禁止にする」べきです。

andi 2000/03/11(土) 00:19:29
突っ込まれると思ったので敢えて<b>としたんですけどね。
<bの後に>が来る場合だけ許可すれば良いかと。
ただし閉じタグもきちんと考えてね。

Ichi 2000/03/11(土) 06:41:40
>禁止属性までチェックするとスクリプトも複雑になりますし、負荷もあがります。
といっても、結局チェックするのは、投稿時のみですから、閲覧時の負荷を考えれば
微々たる物だと思います。(閲覧時の負荷を軽減する特別な措置を講じてあれば別)

../200003/00030086.htm
でも書きましたが、
m/<[^>]* style=[^>]*>/
でstyle属性が入ってるかどうか解ります。(怪しいのも引っかかりますが)
後、私の調べた限りでは、background, onXxxx属性も危険です。

それでも、一番安全なのは全て禁止することですが。

>タグ許可式が確実
新しいタグが出てきたらどうするか、という問題もありますから。
ただ、属性が問題なのです。onXxxxでjavascriptでも書けるので。
属性まで許可制にするには、本気で構文解析するくらいになりますから。

zizz... [HomePage] 2000/03/11(土) 16:02:54
Hotmailがてこずっていたことからもわかるように、HTMLのフィルタリングは難しいです。
やっぱり全部禁止が一番でしょう。

http://docs.iplanet.com/docs/manuals/js/client/jsguide/embed.htm#1013293
Netscapeの場合これで属性にJavaScriptを書くことが出来ます。
これはHTML 4.01では Reserved syntax となっています。
http://www.w3.org/TR/html40/appendix/notes.html#h-B.7.1

S-pore [HomePage] 2000/03/11(土) 19:37:13
私の場合は,
・a b i u s font sup sub のみ許可
・タグの中に " on", " style", " background", "script" という文字列が含まれていたら全タグを無効に
・タグの中の「"」や「'」は取り除く
・使われているタグの閉じタグを逆順で最後に付加する
・font size は 5 以下(相対 +2 以下)のみ有効
といった感じでやってます。
これでもやっぱり穴があるんでしょうかね。(^^;

びーだま [E-Mail] 2000/03/11(土) 19:42:46
> これでもやっぱり穴があるんでしょうかね。(^^;

この順番だとありますね。(^-^)

o"nClick とかね。

要するにですね。
”取り除く”という処理は単純に処理してはいけません。

S-pore [HomePage] 2000/03/11(土) 20:01:42
Σ(゜д゜)!
ホントだ・・・気づかなかった・・・。(^^;;;
ご指摘どうもありがとうございます。
それなら・・・

> ・タグの中の「"」や「'」は取り除く
・タグの中の「"」や「'」は「 」(スペース)に変換

これでどうでしょ?

S-pore 2000/03/11(土) 20:27:57
ていうか処理の順番を変えればいいのか。(^^;
・タグの中の「"」や「'」は取り除く
を最初にやることにします。

びーだま [E-Mail] 2000/03/11(土) 21:28:00
考え方として重要なのは、”取り除く”操作を行ったものを
放っておいてはいけません。取り除いたら、その結果が安全
なパターンんかどうかを必ず調べるのが重要ということですね。

ちなみに、「"」「'」 を単純にスペースに変換するのは、
文法に正しくないHTMLを生み出す危険性があります。

びーだま [E-Mail] 2000/03/11(土) 21:40:01
あ、もう一つ、考え方としては ”有れば○○する”より、
”良ければ○○”する方が安全ですね。

何を言っているかというと、今はまだない未知の属性が追加され、
それが安全でない方法をもたらした場合は、S-pore さんのものは
安全性が崩れますね。

出来れば、タグの中の属性を抽出して、属性名そのものと、属性値に
関して、処理し許可できるパターンとなったら、それを許可する
くらいのことが出来ると良いですね。。

と、書きつつ、そうしたいな。と思いつつ、をーめんどくさそう。
ってことで、実装したことはない(というか基本的に私は、全部
&lt; &gt; してしまう派なので)んですが。。。(^^;

根気ある人、このポリシーで書いてみませんか?(他力本願)
で、良ければ、おしえてー (ずるい)

zizz... [HomePage] 2000/03/11(土) 22:48:34
やばそうなものを二つ挙げておきます。

uriに "javascript:〜" と指定されているのをはじく場合、javascriptにマッチすれば良いように思えるが、
Numeric character referencesを使い、
"j&#x61;vascript:〜"
とするとマッチしません。
この方法は、何故かNetscapeでは無効です (多分バグ)。MSIE 5.0ではJavaScriptのコードが実行されました。
というわけで、Character referencesも考慮しないといけないかもしれません。

&{〜}; のマクロの場合 (&はASCIIのです)、
<B abcd="&{〜};"> などサポートしていない属性に指定してもNetscapeは実行しました。
&を全角のものに置きかえると大丈夫なようです。

S-pore 2000/03/12(日) 00:19:03
うわ〜,ホントに次から次へと穴がでてきますね。
全タグ禁止にしたくなってきた・・・。(^^;
でもせっかくタグ関係処理だけで100行以上(C言語)書いたんでここで負けるのは惜しいです。(謎)
というわけで,
・タグの中に "&#", "{" という文字列が含まれていたら全タグを無効にする

おまけ 2000/03/12(日) 00:55:05
おまけに、これから出現してくるブラウザや各種OSの複数の
ブラウザ、ゲームやテレビまでひっくるめて動作が違うとおもいますよ

andiさんの
>まずすべてのタグを禁止し、<b>とか安全そうなタグを
>許可するとか。
素直にこれがおすすめです。

余談ですが、ここにあまり沢山の「可能性」を記述しない方が
セキュリーティー的には良いと思います。

さやか [E-Mail] [HomePage] 2000/03/12(日) 01:27:35
知人から聞いたことがあるのですが、<body>だか</body>だかを書かれると、それ以降文字の表示がされないとか……。

やっぱり当たり障りのないタグを許可するのが妥当だと思います。

Ichi 2000/03/12(日) 06:31:23
>びーだまさん
それはすでに構文解析ですね。
# これやりましょうか。大変ですが
# やるとしたら新しいスレッドを立てたほうがいいですね)

><body>だか</body>だかを書かれると
<span style="font-size:512px>
でも十分大変なことになりますね。

>uriに〜
uriを指定できるものを全て禁止すれば良いと思います。
>&{〜}; のマクロ
そんな方法もあるんですね。でもまだ予約されている段階
らしいのですが。(<仕様書)

びーだま [E-Mail] 2000/03/12(日) 10:51:56
> Ichi さん
Perl で構文解析ですか。
行指向解析言語である限り完全な物は出来得えないと考えますが、
別スレッドたててみましょうか。 出来るなら興味があります。

masa 2000/03/13(月) 18:38:00
皆さんいろいろありがとうございます。
大体分かりました。
YY-BOARDをでしようと思っているんですが、

フォームデコードの部分を↓みたいにしてみました。
こんなんじゃだめですかね?
最後のstyleとonxxxを無効にする部分なんですけど
こんな感じでいいんでしょうか?
perl初心者なので自信が有りません・

$value =~ s/<!--(.|\n)*-->//g;
$value =~ s/<SCRIPT/\&lt\;SCRIPT/ig;
$value =~ s/<form/\&lt\;form/ig;
$value =~ s/<span/\&lt\;span/ig;
$value =~ s/<t/\&lt\;t/ig;
$value =~ s/<\/t/\/\&lt\;t/ig;
$value =~ s/<body/\&lt\;body/ig;
$value =~ s/<html/\&lt\;html/ig;
$value =~ s/<meta/\&lt\;meta/ig;
$value =~ s/<xmp/\&lt\;xmp/ig;
$value =~ s/<>/&lt\;&gt\;/g;
$value =~ s/<([^>]*) style=[^>]*>/<$1>/ig;
$value =~ s/<([^>]*) on.*=[^>]*>/<$1>/ig;

Ichi 2000/03/14(火) 06:22:46
とりあえず、これだと
<body>が&lt;body>となって
>が浮いてしまうのでまずいです。

masa 2000/03/14(火) 16:57:21
やっぱ>も&gt;にしなきゃいけないですかね…
しなくてもタグは無効になるんだけど…

masa 2000/03/14(火) 17:17:21
そしたら
こんな感じですか?

$value =~ s/<!--(.|\n)*-->//g;
$value =~ s/<(SCRIPT[^>]*)>/\&lt\;$1\&gt\;/ig;
$value =~ s/<form[^>]*)>/\&lt\;$1\&gt\;/ig;
$value =~ s/<span[^>]*)>/\&lt\;$1\&gt\;/ig;
$value =~ s/<t[^>]*)>/\&lt\;$1\&gt\;/ig;
$value =~ s/<\/t[^>]*)>/\&lt\;\/$1\&gt\;/ig;
$value =~ s/<body[^>]*)>/\&lt\;$1\&gt\;/ig;
$value =~ s/<html[^>]*)>/\&lt\;$1\&gt\;/ig;
$value =~ s/<meta[^>]*)>/\&lt\;$1\&gt\;/ig;
$value =~ s/<xmp[^>]*)>/\&lt\;$1\&gt\;/ig;
$value =~ s/<>/&lt\;&gt\;/g;
$value =~ s/<([^>]*) style=[^>]*>/<$1>/ig;
$value =~ s/<([^>]*) on.*=[^>]*>/<$1>/ig;

Ichi 2000/03/15(水) 06:20:18
>[^>]*)
([^>]*)
ですね。

あと、これだと<font face=">>>>>>">なんてされたとき困ります。
(>>>>>が入ってしまう)
一応""中に>を書く時は&lt;と書かなければならないことになっていますが。
これもチェックした方がいいでしょう。(""中の>, &など)

Ichi 2000/03/15(水) 06:21:09
あと、background属性も危険です。

Nick-IB [E-Mail] 2000/03/17(金) 21:36:41
「許可したタグの中に許可した属性名しか書き込めない」
よう改造した掲示板を置いてあります。
http://206.253.222.116/nick-ib/test/minibbs.cgi

スクリプトも公開してあるので、荒らせるかどうか
試してみて頂けるとコチラとしても有難いのですが。^^;;

masa 2000/03/20(月) 15:26:33
Ichiさんありがとうございます。
Ichiさんの指摘を直したら大体いですね。

あと、最後に聞きたいんですが、
もし、掲示板が荒らされたら、被害に遭うには
その掲示板を見た人だけですよね?

掲示板を置いてるサーバーは別に被害は受けませんよね?

andi 2000/03/20(月) 19:41:40
>掲示板を置いてるサーバーは別に被害は受けませんよね?
荒らされ方によると思います。
試したことありませんが、IMGタグ等で自分(CGI)を
読み込んだりしたら被害ありそう。

ところでmasaさんの方法だと新しいタグに対応出来ないのでは?
自分が最初の方で書いたのは取り敢えず全てのタグを&gt; &lt:
に変換して/&gt;b&lt;/のようにした方が良いのでは?
ということだったのですが・・・

びぃす 2000/03/21(火) 04:24:48
ずいぶん前のことなのでURLなど失念しましたが、
<太く>こんにちは</太く>
といったような形式の独自方式を使っているところが
ありました。これなら閉じる対応を確認してから単純に
置き換えればいいので安全なように思いました。
もちろん andiさんのおっしゃるタグ無効化の後の処理です。

Ichi 2000/03/21(火) 05:26:20
>掲示板を置いてるサーバーは別に被害は受けませんよね?
どんなCGIでもCGIを置いている限り、被害を受ける可能性はあります。
例えば、毎秒60回CGIをリクエストするとか。非常に負荷がかかります。
(スクリプトならスクリプトのコンパイルの負荷もかかります)

あとは、サーバーのセキュリティのレベルにもよりますが、当該CGIがサーバーの
ほかのユーザのファイルにアクセスできる様になっていた場合、
CGIにセキュリティホールがあれば、大変なことになります。
(e.g.SSIコマンド素通し)

Ichi 2000/03/21(火) 05:27:27
>当該CGIがサーバーのほかのユーザのファイルにアクセスできる様になっていた
これは立派なセキュリティホールですね。

masa 2000/03/21(火) 16:30:46
[[解決]]
皆さんありがとうございます。
やっぱタグは安全タグのみ許可でいきます。

[上に] [前に] [次に]