掲示板で <IMG src=" を一部許可する方法は

[上に] [前に] [次に]
omi 1998/11/09(月) 02:23:54
掲示板にタグを許すと、
エッチ画像を張り付けて ケッケ(^o^) と喜ぶコマッタちゃんに、
狙われそうなので、以下の CGIを考えました。

@ok =('pass','nasa','airnet');  #厳しいプロバイダ

if ( $FORM{'MESSAGE'} =~ /<img(.|\n)*src( *)=(.|\n)*>/ ){
  $non = 1;
  foreach( @ok ){
    if ( $FORM{'MESSAGE'} =~ / src="(.+)$_(.+)"/) { $non=0; last;}
  }
  if ( $non ) { &errorExit('入力ミス','ソースに制限があります';}
}
これだと
入力された文字列のどこかに src="hogepassfuga" があれば、
他の src="http:///hardcore.com/egeg.jpg" も通ってしまいます。

<img src = の直後をテストする必要があるのですが、
正規表現がチンプンカンプンだし、アルゴリズムもおかしいし
ちょっと無謀な気もするのですが、みなさまのお知恵を下さい。

B-Cus 1998/11/09(月) 02:56:08
> @ok =('pass','nasa','airnet'); #厳しいプロバイダ

よくわかんないんですけど、これって、
 「airnet.or.jpのコンテンツの管理は厳しいので、
  そこの画像ならばimg srcでのリンクを許可する」
っていう意味ですか?

匿名希望 [E-Mail] [HomePage] 1998/11/09(月) 15:38:43
B-Cus さん、ご察しの通りです。v(^。^)
それと、
メールで、「私のサーバの画を見せてあげる」とか、
掲示板で、「このサイトの画は、許してよー」とか、
で、@ok を追加するつもりです。
ありゃ、、項目が数十になると、処理が重たくなるなぁ。
実は、
.jp があれば それほどでもないからまーいっかなー。
src="" に書式制限があっても、善意の人は理解してくれるよ。
と思っていますが、甘い考えですかね。

コードテストに時間がかかりそうで、簡単ではありませんが、
よろしくお願いします。<(_ _)>

mura [E-Mail] 1998/11/09(月) 22:01:47
Perlはほとんど知らないので違っているとこがあったら適宜直して下さい。

>if ( $FORM{'MESSAGE'} =~ /<img(.|\n)*src( *)=(.|\n)*>/ ){

ここは split(/<img( |\n)/) をかけて、foreachか何かでループさせるといいと思います。
(1か所でもエラーが出たらerrorExitで抜けることになります。)
これで漏らさずチェックできます。

imgも大文字小文字区別しないようにするといいかもしれません。
($FORM{'MESSAGE'}を小文字化して別の変数に入れると楽にできると思います)

>@ok =('pass','nasa','airnet'); #厳しいプロバイダ

@ok =('.pass.or.jp/','.nasa.or.jp/','.airnet.or.jp/');
の方がもう少し正確に調べられます。
(適当にor.jpをつけてますので違ってれば書き換えてください)

>if ( $FORM{'MESSAGE'} =~ / src="(.+)$_(.+)"/) { $non=0; last;}

if ( $FORM{'MESSAGE'} =~ /\bsrc="http://([^/]+)$_(.+)"/) { $non=0; last;}

掲示板なら「IMG SRC=」の次は「http://」と決め打ちしていいですよね?
\bは単語の区切りのつもりです。

LOWSRCもチェックした方がいいかもしれません。
(<IMG LOWSRC=... SRC=...>の形で書かれます)
LOWSRCがあるなら、LOWSRCとSRCのチェックをクリアしてはじめて$non=0が入ります。
LOWSRCが入らなければSRCをチェックです。

あと、<A HREF=...>で書く部分や、URL直書き(HTMLタグを使わない)で書かれた分は
防げませんが、それでもかまわないってことでいいんでしょうか。
#他にも抜け道がありそう

Aurai 1998/11/09(月) 23:09:58
@ok =('www.fureai.or.jp','www.tohoho-web.com');

@src = ( $FORM{'MESSAGE'} =~ m|<img src="http://([^"]*)">|ig );

$acceptcount = -1;
foreach (@src) {
$accept = 0;
$i = $_;
foreach(@ok){
if ($i =~ /^$_/) {$accept = 1;}
}
if ($accept){
$acceptcount++;
}
}
@imgcount = ( $FORM{'MESSAGE'} =~ m|<img|ig );
if ( $#imgcount != $acceptcount ){&errorExit;}

こんなんでどうでしょう
URLの頭をOKリストに入れるようになっています
SRC以外のついたIMGタグもキックします
とりあえず私の環境では動きました

B-Cus 1998/11/09(月) 23:50:29
うーん、こういうアプローチって難しいと思いますよ。

・ちょっと間違ったHTMLでも各ブラウザはむりやり解釈するので、
 こちらも間違ったHTMLに対応しなければならない
 # 例えば <img src=http://hogehoge..>などと、ダブルクォートで囲ってない場合

・muraさんが書かれたように、LOWSRCなどいろんなelementに対応しなければ
 ならない。

・IPアドレスでサーバ名を指定した場合。

などなど。

とはいえ、「間違ったHTML、一般的でないタグ、IPアドレスなどは不許可」
と決めてしまうならそれはそれでいいでしょう。

あと、こういうのはタグ自動修正機能に付け加える形を取ると
簡単かもしれませんね。
 /<img(.|\n)*src( *)=(.|\n)*>/
こんな風にスペースとか改行とかに気を使う必要がなくなりますから。

しなのむし 1998/11/10(火) 02:27:37
コンテンツの管理が厳しいプロバイダーだから
そこからの画像はオッケー(エッチじゃない)
ってのはあまり確実な管理法とは思えませんね。(失礼)
投稿時にパスワードを入れたら画像が貼れるようにしたら
どうですか?

mura [E-Mail] 1998/11/10(火) 09:10:53
そうでした、「$a ~= /hoge/i」で大小文字区別なしの比較ができるんでした。
あと私が書いたやつなら<IMG SRC=... SRC=...>と1つのタグの中に2か所書かれたら
アウトになる時があります。

>コンテンツの管理が厳しいプロバイダーだから
>そこからの画像はオッケー

ftpアップロードして、消されるまでは見れてしまいますからね。

mura 1998/11/10(火) 12:33:25
やっぱIMGタグのチェックはだめですね。
<IMG SRC="よい画像" onLoad="this.src='悪' + 'い' + '画' + '像';">

一部の掲示板にあるように、画像はそれ専用のURLを書く欄を用意して、
1枚しか(入力欄を3つ用意すれば3つしか)貼らせないとかすれば
チェックする側は楽になりますが…。

omi [HomePage] 1998/11/10(火) 16:49:26
皆さんありがとうございます。
<img src= だけじゃなくて、<input type=image、<img lowsrc、<embed src=、
もチェックしたいので、 検索文字は src= だけにしました。
href= を許すと、マインスイーパみたいになるかな。

mura さん Aurai さん、とっても参考になりました。
大変でしたね。お疲れさまです。 ありがたいコード Y(^^)Y
なのにアレンジに勢いがついて、正規表現がめちゃくちゃになってしまいました。
試行錯誤で出来たコードは、やっぱり、なんか、おかしいんですよねー。
\b が使えそうだし、> が落ちてるし。

@src = ( $FORM{'MESSAGE'} =~ m|src[ \n\t]*=[ '"\n\t]*([^ '"]*)|ig ); #特に臭い
$acceptcount = -1;  $good = $bad ='';
foreach (@src) {
  $accept = 0;
  $i = $_;
  foreach(@ok){
    if ( $i =~ /$_/) { $accept = 1;}
  }
  if ($accept){ $acceptcount++;  $good .="$i  ";} else { $bad .="$i  ";}
}
if ( $#src != $acceptcount ){ &errorExit('入力ミス',"次のソース名は通りません。$bad<BR>次のは通っています。$good<BR>";}

B-Cus さん、  タグ自動修正機能って、気になりますね。
しなのむし さん、、早速、パスを設けました。
ビジターには、BODY, BASEFONT, FORM, FRAME, ISINDEX, META, PRE, XMP,
SCRIPT, on(.*)=(.|\n)*>,  と、上記の src= を制限することにしました。
パスを通せば、無制限です。どこまで混乱するかなー。PLAINTEXT は止めてます。
制限は無い方が、スマートで進化している気がします。

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