フォームデータ内の特定文字列の該当件数の取得方法

このQ&Aのポイント
  • 禁止ワードを含む掲示板のスパム投稿を拒否する方法について質問があります。
  • 現在は禁止ワードを一つでも含んでいると投稿が拒否されてしまいますが、禁止ワードが本文中に複数個(指定数)書かれていたら拒否するようにしたいです。
  • 現在の処理ではURLが一つも書き込めないため、禁止ワードを複数回書かれている場合のみ拒否する方法を教えてください。
回答を見る
  • ベストアンサー

フォームデータ内の特定文字列の該当件数の取得について

簡単に言ってしまえば、掲示板のスパム投稿を拒否したいのですが、現在は禁止ワードを一つでも含んでいると拒否されてしまいます。 URLを一つも書き込めないのは不便なので、禁止ワードが本文中に複数個(指定数)書かれていたら拒否するようにしたいのですが、どのようにしたらいいのでしょうか? ちなみに、今はこのような処理を行っています。 $comment中に本文が入ります。 # 禁止ワード処理 $flag = 0; @check2=("a href=","tp://"); foreach $check2(@check2){   if ($comment =~ m/$check2/){     $flag=1;   } } if ($flag eq 1){   &error("Deny access!:Spam flag:$flag"); }   # ここまで よろしくお願いいたします。

  • Perl
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

#こんな感じでどうでしょう $limit=2; #禁止ワード該当制限回数 $count = 0; @check2=("a href=","tp://"); foreach $check2(@check2){ $count += @dummy = ($comment =~ m/($check2)/g); } if ($count > $limit){ &error("Deny access!:NG WORD COUNT:$count"); }

gottyato
質問者

お礼

完璧でした。 ありがとうございました。

関連するQ&A

  • 文字列変換

    $word = 'abc'; &word_check($FORM{'comment'}); sub word_check { local($wd) = @_; local($flag); foreach ( split(/,+/, $word) ) { if (index($wd,$_) >= 0) { $flag=1; last; } } if ($flag) { $FORM{'comment'} =~ s/($word)/【文字変換$1】/g; } } $FORM{'comment'}に$wordの文字列が含まれていた場合には対象文字列を変換しようと考えています。 上記のように$wordにabcのみでしたらうまく変換されるのですが、 $word = 'abc,123';というように複数指定した場合にうまくいきません。 繰り返す処理を使うのだと思いますが、あまり知識がないため、うまく出来ません。よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • アクセス制限

    以下スクリプトは$denyに拒否したいリストを記述するのですが、$denyに記述したリストのみをアクセス許可にしたいと思っています。試しに2行目の$flag=0;を$flag=1;にし、4行目$flag=1;を$flag=0;にしましたところ、$denyに記述したリストのみアクセス許可することができたようですが、これで問題ないでしょうか?よろしくお願いいたします。 if ($deny) { $flag=0; foreach (split(/\s+/, $deny)) { if ($host =~ /$_/i) { $flag=1; last; } } if ($flag) { &error("コメント") } }

    • ベストアンサー
    • Perl
  • 禁止ワードの設定についてお尋ねします。

    下記の中で、禁止メールアドレスや禁止用語の設定ができると思うのですが、どの部分に禁止したいメールアドレスや用語を入れればいいのか分かりません。 何方か分かる方いないでしょうか? いた際にはご指導よろしくお願いします。 # 禁止メールアドレスのチェック if(@ngemails){ local($ngemail_flag) = '0'; foreach $ngemail (@ngemails){ if($in{'email'} eq $ngemail){$ngemail_flag = '1'; last;} } if($ngemail_flag){&error('メールアドレスが拒否されました');} } # 禁止用語のチェック if(@ngwords){ local($ngword_flag) = '0'; foreach $ngword (@ngwords){ if($in{'comment'} =~ /$ngword/i){$ngword_flag = '1';} if($in{'sub'} =~ /$ngword/i){$ngword_flag = '1';} } if($ngword_flag){&error('禁止用語が含まれています');} }

    • ベストアンサー
    • CGI
  • CGI掲示板~禁止ワード追加カスタマイズ

    やっとここまでできました。 前回の質問の後に追加できないので、新たに投稿します。 詳しい内容は前回の質問を見て下さい。 なんとか独自で以下のように禁止ワードを設定できましたが、 最高でも18個が限界のようです。あとはエラーが出ます。 これを好きなだけ設定する方法を教えて下さい。 初期設定の中に追加 ↓↓↓ ## 禁止文字 @haijyo = ( ,'殺' ,'死' ,'宣伝' ,'無修正'); 実際の登録処理の中に追加 ↓↓↓ # 禁止処理 foreach $haijyo (@haijyo) { if ($comment =~ /$haijyo/) { &error('コメントに禁止ワードがあるようです'); } } foreach $haijyo (@haijyo) { if ($name =~ /$haijyo/) { &error('名前に禁止ワードがあるようです'); } } foreach $haijyo (@haijyo) { if ($title =~ /$haijyo/) { &error('タイトルに禁止ワードがあるようです'); } } foreach $haijyo (@haijyo) { if ($risou =~ /$haijyo/) { &error('希望する相手に禁止ワードがあるようです'); } } ここまで必死にきました。宜しくお願いします。

    • 締切済み
    • CGI
  • 大文字と小文字を区別しない検索にする方法

    勉強する間もなく手探りでフリーCGIの改造をさせて頂いています。 if ゃ foreach などは分かりやすいですが、変数の意味が良く理解できていません。 どうぞお力添えをお願い致します。 現在、フリーのCGIでデータ登録と検索をしていますが、大文字と小文字の 区別を無くしたものにするにはどうすればよいでしょうか? 1) AbcDe も abcde も同じにしたい。 2) 可能なら全角と半角も区別無しにしたい。   ただ、2の方は漢字も使うので難しいでしようか? iオプションを使えとの記述を見ましたが、どこを変えるのか解りません。 ソースを載せますので、ご指導宜しくお願い致します。 # 入力内容を整理 $in{'word'} =~ s/\x81\x40/ /g; @wd = split(/\s+/, $in{'word'}); @find=(); $i=0; # 検索処理 foreach (@line) { $flag = 0; foreach $wd (@wd) { if (index($_,$wd) >= 0) { $flag = 1; if ($in{'cond'} eq 'OR') { last; } } else { $andor="and 検索"; if ($in{'cond'} eq 'AND') { $flag=0; last; } $andor="or 検索"; } } # ヒットした場合 $view = $in{'viewc'}; if ( $view eq '' ) { $view = $views } if ($flag) { $i++; next if ($i < $page + 1); next if ($i > $page + $view); push(@find,$_); } } # 検索終了

    • ベストアンサー
    • CGI
  • エラーチェック、ファイルに特定の文字列があったらエラーの処理を出したい。

    たびたび質問すいません。 エラーチェックについて質問です。 sub err_check{ $data="data.txt"; open(LOG,"$data"); @readerlist = <LOG>; close(LOG); foreach $list (@readerlist) { $newlist = $list; $newlist =~ s/\n//g; $newlist =~ s/\r//g; if($newlist eq $mail) {&err("$mail は既に登録済みです");} } } という記述は動作しました。この逆、$mailは登録されていませんというエラー処理を吐き出すには、($newlist eq $mail)を($newlist ne $mail)とやればできるのかと思いましたがうまくいきませんでした。 data.txtの中身はメールアドレスですが、アドレスごとに改行コード↑が入ります。data.txtのファイルの中身を検索して、$mailがなかったら登録してません。と はきだす処理の記述はどのようにしたらいいのでしょうか?

    • ベストアンサー
    • Perl
  • KENTさんの掲示板のワード検索について

    http://www.supra.cx/joyful2chMe/index.html こちらのjoyful2ch.cgiの1071行目からのワード検索で、 検索対象を親記事のみにしたいのですが、どうすればよいでしょうか。 ログの中の$reno=""が親記事のようなのですが・・ # ファイルを読み込み @new=(); open(IN,"$logfile") || &error("Open Error : $logfile"); $top = <IN>; while (<IN>) { $flag=0; foreach $pair (@pairs) { if (index($_,$pair) >= 0) { $flag=1; if ($in{'cond'} eq 'OR') { last; } } else { if ($in{'cond'} eq 'AND') { $flag=0; last; } } } if ($flag) { push(@new,$_); } } close(IN); ここの辺りを書き換えるのでしょうか。

    • 締切済み
    • CGI
  • 高速に文字列の比較

    高速に文字列の比較 open(IN,"$file"); while (<IN>) { my($ip,$flag) = split(/,/,$_); if($flag==1){$data .= "$ip,";} } close(IN); open(IN,"$file2"); while (<IN>) { my($ip,$x,$z) = split(/,/,$_); foreach ( split(/,/, $data) ) { if ($ip eq $_) {$xdata.= "$ip,$x,$z\n";} } close(IN); 1.$fileで、$flagが1なら$ipを変数$dataに加えます。 2.$file2の$ipが、$dataの$ipに含まれていれば,$file2のデーターを$xdataに加えます。 上記の書き方で一応比較は出来ているようなのですが、perlの知識があまりない素人が適当に考えた書き方なので、自信がありません。 $data .= "$ip,";の$ipの後ろに,を入れている部分も何だか変なのですが、他の書き方が思いつけません。 書き方が間違っている場合や、こうすればもっと高速に動作させられるという書き方があれば、ご指導いただけると幸いです。 $fileも$file2も、100万行あたりまで増える見込みなので、出来るだけサーバーに負荷のかからない書き方ができればと思っています。 お手数ですが、どうぞよろしくお願いいたします。

    • ベストアンサー
    • Perl
  • 禁止ワードのすり抜け対策

    現在、以下のようにして禁止ワードを設定しています。 httpという単語を禁止ワードにしているのですが この禁止ワードをすり抜けるために h t t pなどと書き投稿して利用者を悪質な出会い系サイトに誘導しようとする者がおり、困っております。 半角・全角スペースを使って禁止ワードをすり抜けようとする行為をン防止することは可能でしょうか? foreach (@deny) { if (index($FORM{'sender'},$_) >= 0) { &error("入力エラー","禁止ワードが含まれています。"); } if (index($FORM{'from'},$_) >= 0) { &error("入力エラー","禁止ワードが含まれています。"); } if (index($FORM{'sub'},$_) >= 0) { &error("入力エラー","禁止ワードが含まれています。"); } if (index($FORM{'comment'},$_) >= 0) { &error("入力エラー","禁止ワードが含まれています。"); } }

    • ベストアンサー
    • CGI
  • HTML5からのフォーム入力のデータ取得について

    HTML5からのフォーム入力のデータ取得について HTML5で入力フォームを作成しました。 これをCGI(Perl)で入力データを受け取って処理をしたいと考えているのですが HTML4の時みたいに、 if ($ENV{'REQUEST_METHOD'} eq "POST"){ read(STDIN, $querystring, $ENV{'CONTENT_LENGTH'}); } foreach $line (split(/&/, $querystring)){ my ($name, $value) = split(/=/, $line); } このやり方では入力項目の名前と値を取れないのでしょうか? $querystringの中身をみたら、 Content-Disposition: form-data; name="入力項目の名前" 入力した値 という文字の羅列が、入力項目分ありました。 この文字列から一つずつ項目名を拾って、値を拾って。。。 という作業をしないといけないのでしょうか? ネットで色々と探したのですが、 うまいやり方が見つからず、探し方が悪いのかもしれませんが、 どなたかデータの取得のやり方をご存じの方がいらっしゃいましたら 教えてください。 よろしくお願い致します。

    • ベストアンサー
    • Perl

専門家に質問してみよう