- ベストアンサー
禁止ワードに設定できない文字
CGIROOM で配布されている CGI機能拡張用のプログラム『ワードチェック』 (伝言板などに禁止ワードを設定できる) …を利用しているのですが、 これ↑に"登録することができない単語 (つか、文字)"…って、ありますか?? 例えば「半角カンマは駄目」とか。。。 「半角スペースを入れちゃ駄目」とか。。。 登録する単語の数に制限は無いので、 沢山登録したら、…最近、何を書いても 禁止ワード扱いされ、投稿が出来なく なってしまいました~(^_^;) ■備考■ my $word=<<'WORD'; 馬鹿 死ね! ウンチ WORD ↑こんな風に『my $word=<<'WORD';』 と『WORD』の間に、投稿されたくない単語 を書くようになってます。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
大事なのは「どの単語がダメなのか」ではなく、「なぜダメな単語があるのか」だと思うんですよ。 それさえ分かれば、プログラムを直して、思い通りに動かすことができるようになるわけです。 そんなわけで前回のアドバイスは、 > その単語を消せば正常に動くようになる… などという身もフタもないことを言うための布石ではなく、「プログラムをこうすれば直りますよ」というアドバイスのためのものだったんですよ。 (もちろん、「私が責任もって直します」というものではありませんが^^;) で、 「ダメな原因」を探るためには、その「プログラムの検証」が必要 なんですが、 「検証」するためには、「ダメと分かっている単語」が必要 なんですよ。 プログラムの方はダウンロードすれば済むわけですが、ダメな単語を1から探すのは大変だなぁと思ったわけです。 「消せばいいや」というつもりで、「何が悪いの?」と聞かれているだけならば、「同じ経験をし、見つけ出した人」しか答えられないのではないかと思います。 ただ、技術屋から言わせれば、「原因を知らずして、全てのBadWordを挙げるのは不可能」です。 それともう1つ。 >> これは ' のままで大丈夫です。 > あっ。ありがとうございます♪ > そうですかー。…ぢぁ、例えば > 『s'e'x』←こんな単語を登録しても > 大丈夫!ってことですよね。 この ' の話は、「単語」として登録する部分の話ではなく、 my $word=<<'WORD'; という「プログラム」の方の話です。(WORD を囲んでいる ' のこと) 単語登録の方で注意すべきことは、 ・「WORD」というのを禁止ワードにできない ・ $ や @ (共に半角)を入れる場合、それぞれ \$、\@ と書かなければならない 事くらいだと思います。 後は何を書いても大丈夫なはずです。
その他の回答 (5)
- leaz024
- ベストアンサー率75% (398/526)
sun_supinel さん、ご指摘ありがとうございます。 > my $word=<<'WORD'; > とシングルクォーテーションでくくってるのでエスケープしなくても大丈夫では? > $も@も問題なく使えそう。 そうですね。 普段、裸で使ってばかりなんで、すっかり忘れてました^^; # 回答の種類に「お礼」が欲しいところです。
お礼
「お礼」が遅くなってしまい、 本当にごめんなさい☆(謝ってばっか(笑)) 私なりにチョット落ち込んでしまって… スグにレスしたら感情的になって しまいそうな気もしたので、 少し時間を置くことにしたのです(^-^;) お騒がせしました。。。
- sun_supinel
- ベストアンサー率35% (7/20)
一点だけ、、、。 >$ や @ (共に半角)を入れる場合、 >それぞれ \$、\@ と書かなければならない my $word=<<'WORD'; とシングルクォーテーションでくくってるのでエスケープしなくても大丈夫では? $も@も問題なく使えそう。 でもどうすれば質問のような状況になるのか知りたいっす、、、。 ということで、原因となった(追加した)語句を教えてもらえないでしょうか?
お礼
ご回答ありがとうございました♪ >> 原因となった(追加した)語句を >> 教えてもらえないでしょうか? それが・・・全く分からないのです。 自分で探すのには、恐ろしく時間がかかってしまいそうで。。。 (だからここで質問させて頂くことにした) 怪しげな単語いっぱい使ってます。 …あ。今思い出しましたが、前に 全角のアンダーバーを登録した時は駄目だったような気がします。 その時は、「全てが禁止ワード扱いされる」っていうような 症状ではなく、CGIのページ自体がエラーで表示されなくなりました。 でも、アンダーバーを消したら直りました☆ あと、特殊記号も駄目ですよね?? 今回の場合は、「なんか最近、禁止ワードじゃないのに、 禁止ワードになっちゃうことがあるな~」って気がしてきて、 でもあんまり気にせず、それからも時々登録を繰り返してたんです。 そしたら、だんだん禁止ワード扱いされる率が高く なってって、 (その時には全然投稿できなくても、時間を置くと直ってたり。) …で、気づいたら駄目になってました。 『今日イキナリ駄目になった!』っていうのだったら、 「原因は、あの単語かな?」って想像もつくのですが、 徐々になってったんで、もーー全然分からないのです。。。 協力できなくてごめんなさい。 そして、ありがとうございました!m(_ _)m
- yuizuian
- ベストアンサー率42% (103/245)
>>> これは ' のままで大丈夫です。 や、申し訳ない。 嘘ついてしまいました。 >つまり『使えない単語はプログラムによって >マチマチだから、具体的に「この文字は駄目」 >とかは分からない(自分で地道に探すしかない)』 >…って解釈で宜しいのでしょうか。(謎) ちょっと(大分?)違います。 >>> 禁止ワードの判定部分はどうなっているんですか? >「禁止ワードの判定部分」って何ですか? 正規表現はご存知ですか? $QUERY =~ /$word/ の部分です。 ここでマッチングを行う際に、文字コードを誤って判別してしまう単語が$wordに含まれているのでしょう。 #詳しくは #http://www.din.or.jp/~ohzaki/perl.htm#JP_Match 上記URLのサンプルを元に作成した物ですが、 if($QUERY =~ /$word/){ の部分を、 $ascii = '[\x00-\x7F]'; $twoBytes = '[\x8E\xA1-\xFE][\xA1-\xFE]'; $threeBytes = '\x8F[\xA1-\xFE][\xA1-\xFE]'; if ($QUERY =~ /^(?:$ascii|$twoBytes|$threeBytes)*?(?:$word)/i) { にしてみてはどうでしょう? 「SEX」「sEx」「sex」の3つに1度にマッチングさせることもできます。 #全角・半角の判別は、また別の方法になります。 他には$wordの中身を配列に格納してindex関数で1つずつ調べる…なんて方法もありますが、 大文字小文字の区別はつけられません。 どちらにせよ改造になりますから、もしかしたら配布もとのサポート対象外になってしまうかもしれませんので ご自身の責任の元書き換えてみてください。 >ん~~~。す・すみません☆☆ >その手間を惜しんでの質問でした||(-_-;)||| >『この質問のような内容って実は割と常識かな? >ここで聞けば皆さんが教えてくださるかな? >だったら、それが1番ラク。。。』って感じで。(汗;) 質問する者のマナーをもう少し学ばれた方が良いのでは…(^^;
お礼
>> 正規表現はご存知ですか? 本当にごめんなさい。 全くの無知なのです。||(-_-;)||| >> ご自身の責任の元書き換えてみてください。 壊れたら嫌だし、せっかく詳しく 教えて頂いたのに申し訳ないですが、 プログラムを書き換えることはせず 地道に探してみることとします。。。 >> 質問する者のマナーをもう少し学ばれた方が 仰る通りですね。 いろいろ複雑な問題だったとも知らず。 私はテッキリ、これはCGI界では常識で… 『○と○と○は使えませんよ♪』 みたいな答えがソッコーで返ってくる ものとばかり考えておりましたので。 すみませんでした…m(_ _)m
- leaz024
- ベストアンサー率75% (398/526)
> 沢山登録したら、…最近、何を書いても禁止ワード扱いされ とのことですが、まずは「どの単語を入れるとまずいのか」を特定しましょう。 半分ずつ削って行けば、容易に特定できると思います。 また、悪さをしている単語は複数かもしれませんから、その辺にも注意されるとよいでしょう。 この手の問題は、「文字コード」と「マッチング(正規表現)」の問題であることが多いので、入れるとまずい単語を特定して、「この単語を入れると動作がおかしい」と言ってくれると、回答/アドバイスも付きやすいのではないかと思います。 ちなみに、No.1 の yuizuian さんの回答にある、 > my $word=<<'WORD'; > の場合クォーテーション(') > は\'と書かないといけなかったと思います。 についてですが、これは ' のままで大丈夫です。 (逆に \' と書いてしまうとエラーになってしまいます。)
お礼
ご回答ありがとうございました☆ つまり『使えない単語はプログラムによって マチマチだから、具体的に「この文字は駄目」 とかは分からない(自分で地道に探すしかない)』 …って解釈で宜しいのでしょうか。(謎) >>「この単語を入れると動作がおかしい」 >> と言ってくれると、回答/アドバイス >> も付きやすいのではないかと思います。 ん~~~。す・すみません☆☆ その手間を惜しんでの質問でした||(-_-;)||| 『この質問のような内容って実は割と常識かな? ここで聞けば皆さんが教えてくださるかな? だったら、それが1番ラク。。。』って感じで。(汗;) それと「この単語を入れると動作がおかしい」 ってのを自分で調べた後だったら、その単語を 消せば正常に動くようになる…ってことだと思うので、 もう他には何も聞くことが無いです。。。 >> これは ' のままで大丈夫です。 あっ。ありがとうございます♪ そうですかー。…ぢぁ、例えば 『s'e'x』←こんな単語を登録しても 大丈夫!ってことですよね。 ※↑こんな風に文字の間に記号とか入れてきたりするんです。 オカゲで…例えば「sex」って単語だけでも、 「SEX」「sex」「sEx」「SEX」「s○x」「S・E・X」等々、 50パターンくらい登録しておかなければ意味が無い。。。 (…というか、「SEX」って沢山書いてスミマセン。 これじゃ私が荒らしっぽいですね。(溜息))
- yuizuian
- ベストアンサー率42% (103/245)
my $word=<<'WORD'; の場合クォーテーション(') は\'と書かないといけなかったと思います。 >登録する単語の数に制限は無いので、 >沢山登録したら、…最近、何を書いても >禁止ワード扱いされ、投稿が出来なく >なってしまいました~(^_^;) 禁止ワードに設定している文字がなくてもですか? 禁止ワードの判定部分はどうなっているんですか?
お礼
ご回答、ありがとうございます☆ >> 禁止ワードに設定している文字がなくてもですか? はい。「設定してる文字が無くても」です!!(>_<) …あ。「文字」というか、「単語」ですよね?? >> 禁止ワードの判定部分はどうなっているんですか? う~~~。すみません。 「禁止ワードの判定部分」って何ですか? 何か分からないけど、『my $word=<<'WORD';』以外 の部分もココに貼り付けた方が良いでしょうか。 他にも何か思い出されましたら、 宜しくお願いしますぅ☆m(_ _)m
補足
↓こんな風になってました。 ------------- package cgiroomwcheck; #発言禁止文字列 WORDまでなら何行でも追加OK my $word=<<'WORD'; ○○ △△ ◇◇ WORD #禁止ワード発言時の戻り先リンクURL my $url = 'http://***/***/***.cgi'; #jcode.plまでのパス my $require = './jcode.pl'; my($QUERY,@error); if($ENV{'REQUEST_METHOD'} eq 'POST'){ binmode(STDIN); read(STDIN,$QUERY,$ENV{'CONTENT_LENGTH'}); tie *main::STDIN, 'Scalar2handel',$QUERY; }else{ $QUERY = $ENV{'QUERY_STRING'}; } if($QUERY){ require $require; $QUERY =~ tr/+/ /; $QUERY =~ s/%(..)/pack('C', hex($1))/eg; jcode::convert(\$QUERY,'euc'); jcode::convert(\$word ,'euc'); $word =~ s/[\r\n]+$//; $word =~ s/([^\w\r\n])/\\$1/g; $word =~ s/[\r\n]+/|/g; if($QUERY =~ /$word/){ print <<HTML; Content-type: text/html\n\n <HTML><HEAD><META HTTP-EQUIV="Expires" CONTENT="0"></HEAD> <BODY bgcolor="#FFFFFF" text="#FF0000"> <TABLE height="100%" width="100%"><TR><TD align=center><table alicn=center><tr><td align=center><tt>禁止コードが含まれている為、受理できません。<HR size=1><br><font size=5>[<a href="$url">戻る</a>]</font></TD></TR></TABLE></TD></TR></TABLE>system:<A href="http://cgiroom.nu" target=cgiroom>CGIROOM</A></BODY></HTML> HTML exit; } } # ダミーSTDIN 2001/10/11 package Scalar2handel; sub TIEHANDLE{ my $class = shift; my $self = { 'scalar' => shift , 'position' => 0 , }; $self->{'length'} = length($self->{'scalar'}); bless $self , $class; } sub READ { my $self = shift; my($undef,$len,$offset) = @_; $offset += 0; my $position = $self->{'position'}; $len < 0 && die "Negative length\n"; my $tmp = $position + $len; $self->{'position'} = $tmp if $position >= $tmp ; $_[0] = $offset > 0 ? " " x $offset : ""; $_[0] .= substr($self->{'scalar'},$position ,$len); length($_[0]) } sub READLINE { my $self = shift; my $position = $self->{'position'}; return undef if $self->EOF; if(wantarray){ $self->{'position'} = $self->{'length'}; substr($self->{'scalar'},$position); }else{ $self->{'position'} = index( $self->{'scalar'} , $/ , $self->{'position'} ) + 1; $self->{'position'} = $self->{'length'} if $self->{'position'} == 0; $.++; substr( $self->{'scalar'} , $position , $self->{'position'} - $position ); } } sub GETC { my $self = shift; if($self->{'position'} + 1 <= $self->{'length'}){ substr($self->{'scalar'},$self->{'position'}++,1) } } sub SEEK { my( $self , $position , $whench ) = @_; if($whench == 0){ if( $self->{'length'} >= $position ){ $self->{'position'} = $position }else{ return 0 } }elsif($whench == 1){ my $tmp = $self->{'position'} + $position; if($tmp >= 0 && $tmp <= $self->{'length'}){ $self->{'position'} = $tmp }else{ return 0 } }elsif($whench == 2){ my $tmp = $self->{'length'} + $position; if($tmp >= 0 && $tmp <= $self->{'length'}){ $self->{'position'} = $tmp }else{ return 0 } }else{ return 0 } return 1 } sub EOF { $_[0]->{'position'} == $_[0]->{'length'} ? 1 : 0 } sub TELL { $_[0]->{'position'} } sub BINMODE { 1 } sub CLOSE{ $. = 0; } sub WRITE { push(@error,"WRITE に対応しておりません\n") } sub PRINT { push(@error,"PRINT に対応しておりません\n") } sub PRINTF { push(@error,"PRINTF に対応しておりません\n") } sub FILENO { push(@error,"FILENO に対応しておりません\n") } END { print "<div align=right><!--\n@error--><font size=1><a style='TEXT-DECORATION:NONE' href='http://cgiroom.nu'>Word checker v1.10</a></div>" if @error; } 1; ----------------- …長い。(汗;) てか、これって、もしかしたら違反?? 無断転載?とか著作権?とかの。。。 ※駄目だったら消してください。>管理人さん
お礼
>> 「プログラムをこうすれば直りますよ」という >> アドバイスのためのものだったんですよ。 そうでしたか。申し訳ありませんでした! でも私、プログラムは絶対に書き換えたくないのです(T-T) ( このことを質問文の方に補足しておくべきでしたね。) 書き換えようとしたら、いつも失敗しちゃうから。 ・・・なんかでも、皆様からのご回答を読む限りでは 結局『使えない単語は無いはず』ってことみたいで。。。 じゃあ私が禁止ワードを書き変える際などに誤って プログラムの一部を削除してしまったのかもしれないです。 (以前にもそういうことがあったから。) もう1度DLするところからやり直してみたいと思います。 何度もありがとうございました。 そしてスミマセンでした。m(_ _)m