【お題】NEW演歌

CGIROOM で配布されている
CGI機能拡張用のプログラム『ワードチェック』
(伝言板などに禁止ワードを設定できる)
…を利用しているのですが、

これ↑に"登録することができない単語
(つか、文字)"…って、ありますか??
例えば「半角カンマは駄目」とか。。。
「半角スペースを入れちゃ駄目」とか。。。

登録する単語の数に制限は無いので、
沢山登録したら、…最近、何を書いても
禁止ワード扱いされ、投稿が出来なく
なってしまいました~(^_^;)

■備考■

my $word=<<'WORD';
馬鹿
死ね!
ウンチ
WORD

↑こんな風に『my $word=<<'WORD';』
と『WORD』の間に、投稿されたくない単語
を書くようになってます。

A 回答 (6件)

大事なのは「どの単語がダメなのか」ではなく、「なぜダメな単語があるのか」だと思うんですよ。


それさえ分かれば、プログラムを直して、思い通りに動かすことができるようになるわけです。
そんなわけで前回のアドバイスは、
> その単語を消せば正常に動くようになる…
などという身もフタもないことを言うための布石ではなく、「プログラムをこうすれば直りますよ」というアドバイスのためのものだったんですよ。
(もちろん、「私が責任もって直します」というものではありませんが^^;)

で、
  「ダメな原因」を探るためには、その「プログラムの検証」が必要
なんですが、
  「検証」するためには、「ダメと分かっている単語」が必要
なんですよ。
プログラムの方はダウンロードすれば済むわけですが、ダメな単語を1から探すのは大変だなぁと思ったわけです。

「消せばいいや」というつもりで、「何が悪いの?」と聞かれているだけならば、「同じ経験をし、見つけ出した人」しか答えられないのではないかと思います。
ただ、技術屋から言わせれば、「原因を知らずして、全てのBadWordを挙げるのは不可能」です。

それともう1つ。
>> これは ' のままで大丈夫です。
> あっ。ありがとうございます♪
> そうですかー。…ぢぁ、例えば
> 『s'e'x』←こんな単語を登録しても
> 大丈夫!ってことですよね。
この ' の話は、「単語」として登録する部分の話ではなく、
  my $word=<<'WORD';
という「プログラム」の方の話です。(WORD を囲んでいる ' のこと)

単語登録の方で注意すべきことは、
・「WORD」というのを禁止ワードにできない
・ $ や @ (共に半角)を入れる場合、それぞれ \$、\@ と書かなければならない
事くらいだと思います。
後は何を書いても大丈夫なはずです。
    • good
    • 0
この回答へのお礼

>> 「プログラムをこうすれば直りますよ」という
>> アドバイスのためのものだったんですよ。

そうでしたか。申し訳ありませんでした!
でも私、プログラムは絶対に書き換えたくないのです(T-T)
( このことを質問文の方に補足しておくべきでしたね。)
書き換えようとしたら、いつも失敗しちゃうから。
・・・なんかでも、皆様からのご回答を読む限りでは
結局『使えない単語は無いはず』ってことみたいで。。。
じゃあ私が禁止ワードを書き変える際などに誤って
プログラムの一部を削除してしまったのかもしれないです。
(以前にもそういうことがあったから。)
もう1度DLするところからやり直してみたいと思います。

何度もありがとうございました。
そしてスミマセンでした。m(_ _)m

お礼日時:2002/06/06 03:17

sun_supinel さん、ご指摘ありがとうございます。



> my $word=<<'WORD';
> とシングルクォーテーションでくくってるのでエスケープしなくても大丈夫では?
> $も@も問題なく使えそう。

そうですね。
普段、裸で使ってばかりなんで、すっかり忘れてました^^;

# 回答の種類に「お礼」が欲しいところです。
    • good
    • 0
この回答へのお礼

「お礼」が遅くなってしまい、
本当にごめんなさい☆(謝ってばっか(笑))
私なりにチョット落ち込んでしまって…
スグにレスしたら感情的になって
しまいそうな気もしたので、
少し時間を置くことにしたのです(^-^;)
お騒がせしました。。。

お礼日時:2002/06/06 03:43

一点だけ、、、。



>$ や @ (共に半角)を入れる場合、
>それぞれ \$、\@ と書かなければならない

my $word=<<'WORD';
とシングルクォーテーションでくくってるのでエスケープしなくても大丈夫では?
$も@も問題なく使えそう。

でもどうすれば質問のような状況になるのか知りたいっす、、、。

ということで、原因となった(追加した)語句を教えてもらえないでしょうか?
    • good
    • 0
この回答へのお礼

ご回答ありがとうございました♪

>> 原因となった(追加した)語句を
>> 教えてもらえないでしょうか?

それが・・・全く分からないのです。
自分で探すのには、恐ろしく時間がかかってしまいそうで。。。
(だからここで質問させて頂くことにした)
怪しげな単語いっぱい使ってます。

…あ。今思い出しましたが、前に
全角のアンダーバーを登録した時は駄目だったような気がします。
その時は、「全てが禁止ワード扱いされる」っていうような
症状ではなく、CGIのページ自体がエラーで表示されなくなりました。
でも、アンダーバーを消したら直りました☆

あと、特殊記号も駄目ですよね??

今回の場合は、「なんか最近、禁止ワードじゃないのに、
禁止ワードになっちゃうことがあるな~」って気がしてきて、
でもあんまり気にせず、それからも時々登録を繰り返してたんです。
そしたら、だんだん禁止ワード扱いされる率が高く
なってって、
(その時には全然投稿できなくても、時間を置くと直ってたり。)
…で、気づいたら駄目になってました。

『今日イキナリ駄目になった!』っていうのだったら、
「原因は、あの単語かな?」って想像もつくのですが、
徐々になってったんで、もーー全然分からないのです。。。

協力できなくてごめんなさい。
そして、ありがとうございました!m(_ _)m

お礼日時:2002/06/06 03:37

>>> これは ' のままで大丈夫です。



や、申し訳ない。
嘘ついてしまいました。

>つまり『使えない単語はプログラムによって
>マチマチだから、具体的に「この文字は駄目」
>とかは分からない(自分で地道に探すしかない)』
>…って解釈で宜しいのでしょうか。(謎)

ちょっと(大分?)違います。

>>> 禁止ワードの判定部分はどうなっているんですか?
>「禁止ワードの判定部分」って何ですか?

正規表現はご存知ですか?
$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番ラク。。。』って感じで。(汗;)

質問する者のマナーをもう少し学ばれた方が良いのでは…(^^;

参考URL:http://www.mirai.ne.jp/~mikeneko/yuibot/yuibot/f …http://www.din.or.jp/~ohzaki/perl.htm#JP_Match
    • good
    • 0
この回答へのお礼

>> 正規表現はご存知ですか?

本当にごめんなさい。
全くの無知なのです。||(-_-;)|||

>> ご自身の責任の元書き換えてみてください。

壊れたら嫌だし、せっかく詳しく
教えて頂いたのに申し訳ないですが、
プログラムを書き換えることはせず
地道に探してみることとします。。。

>> 質問する者のマナーをもう少し学ばれた方が

仰る通りですね。

いろいろ複雑な問題だったとも知らず。
私はテッキリ、これはCGI界では常識で…
『○と○と○は使えませんよ♪』
みたいな答えがソッコーで返ってくる
ものとばかり考えておりましたので。

すみませんでした…m(_ _)m

お礼日時:2002/06/06 02:57

> 沢山登録したら、…最近、何を書いても禁止ワード扱いされ


とのことですが、まずは「どの単語を入れるとまずいのか」を特定しましょう。
半分ずつ削って行けば、容易に特定できると思います。
また、悪さをしている単語は複数かもしれませんから、その辺にも注意されるとよいでしょう。

この手の問題は、「文字コード」と「マッチング(正規表現)」の問題であることが多いので、入れるとまずい単語を特定して、「この単語を入れると動作がおかしい」と言ってくれると、回答/アドバイスも付きやすいのではないかと思います。

ちなみに、No.1 の yuizuian さんの回答にある、
> my $word=<<'WORD';
> の場合クォーテーション(')
> は\'と書かないといけなかったと思います。
についてですが、これは ' のままで大丈夫です。
(逆に \' と書いてしまうとエラーになってしまいます。)
    • good
    • 0
この回答へのお礼

ご回答ありがとうございました☆

つまり『使えない単語はプログラムによって
マチマチだから、具体的に「この文字は駄目」
とかは分からない(自分で地道に探すしかない)』
…って解釈で宜しいのでしょうか。(謎)

>>「この単語を入れると動作がおかしい」
>> と言ってくれると、回答/アドバイス
>> も付きやすいのではないかと思います。

ん~~~。す・すみません☆☆
その手間を惜しんでの質問でした||(-_-;)|||
『この質問のような内容って実は割と常識かな?
ここで聞けば皆さんが教えてくださるかな?
だったら、それが1番ラク。。。』って感じで。(汗;)
それと「この単語を入れると動作がおかしい」
ってのを自分で調べた後だったら、その単語を
消せば正常に動くようになる…ってことだと思うので、
もう他には何も聞くことが無いです。。。

>> これは ' のままで大丈夫です。

あっ。ありがとうございます♪
そうですかー。…ぢぁ、例えば
『s'e'x』←こんな単語を登録しても
大丈夫!ってことですよね。

※↑こんな風に文字の間に記号とか入れてきたりするんです。
オカゲで…例えば「sex」って単語だけでも、
「SEX」「sex」「sEx」「SEX」「s○x」「S・E・X」等々、
50パターンくらい登録しておかなければ意味が無い。。。
(…というか、「SEX」って沢山書いてスミマセン。
これじゃ私が荒らしっぽいですね。(溜息))

お礼日時:2002/06/05 03:52

my $word=<<'WORD';


の場合クォーテーション(')
は\'と書かないといけなかったと思います。

>登録する単語の数に制限は無いので、
>沢山登録したら、…最近、何を書いても
>禁止ワード扱いされ、投稿が出来なく
>なってしまいました~(^_^;)

禁止ワードに設定している文字がなくてもですか?
禁止ワードの判定部分はどうなっているんですか?

この回答への補足

↓こんな風になってました。
-------------
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;
-----------------
…長い。(汗;)
てか、これって、もしかしたら違反??
無断転載?とか著作権?とかの。。。
※駄目だったら消してください。>管理人さん

補足日時:2002/06/05 03:47
    • good
    • 0
この回答へのお礼

ご回答、ありがとうございます☆

>> 禁止ワードに設定している文字がなくてもですか?

はい。「設定してる文字が無くても」です!!(>_<)
…あ。「文字」というか、「単語」ですよね??

>> 禁止ワードの判定部分はどうなっているんですか?

う~~~。すみません。
「禁止ワードの判定部分」って何ですか?
何か分からないけど、『my $word=<<'WORD';』以外
の部分もココに貼り付けた方が良いでしょうか。

他にも何か思い出されましたら、
宜しくお願いしますぅ☆m(_ _)m

お礼日時:2002/06/05 03:34

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報