• 締切済み

フォーム経由で送られるURLつきスパムを排除したい

cgiによる簡単なフォームを設置しています。 が、そこから海外のspamが複数送られてくるので、その回避方法を考えています。 フォームは名前、メールアドレスを送信するだけの簡単なものです。 html側のinputタグ内でmaxlengthを指定していますが、 それを超えた長さの、URLを含む宣伝が送信されてきてしまいました。 最初に送信されてから昼夜を問わずどんどん来るようになったので、 ソフトか何かで送信しているかもしれません。 入力データを直接cgiのアドレスか何かにくっつけて送っていると思うのですが、 このようなポストをはじくことはできますでしょうか? 考えられる回避方法は ・入力値に規定の文字数以上のものが入るとエラーを出す ・入力値にURLが入るとエラーを出す など・・・ cgi側には一応、投稿時に入力データをチェックするサブルーチンがあり、 ここに何か追加する感じで上記の処理ができないでしょうか。 sub datacheck { if (!$name) { &Print_Error('name'); } else { $name =~ s/?r?n|?r|?n//g; } if (!$email) { &Print_Error('email'); } elsif ($email !~ /.+?@.+?..+/) { &Print_Error('email'); } else { $email =~ s/?r?n|?r|?n//g; } return; } IPでのアクセス制限も考えたんですが、 プロキシを通しているようなのであまり効果がなさそうです。 前述のようにガンガン送られてくるので、 他のまっとうな投稿が読みにくくなったり、 ログファイルがめちゃくちゃになってしまうので、とても困っています。 perlの技術力は、切り貼りができる初心者程度なのですが・・ よろしくお願いいたします。

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

みんなの回答

回答No.2

自分の経験上、一番効果があると思えるのは「合い言葉」です。SPAMMERな連中は、botなどのソフトで自動送信してくるので、「投稿に人手が必要」なのが一番の苦手です。何でもイイから、人間が考えて手で入力させる欄を1つ設けるだけで効果があります。 掲示板スパム対策 で説明されている他の対策も一通り施してみましたが、 - これまでで一番の効果が上がっているのが「合い言葉」。「合い言葉」として、簡単な足し算引き算の式を表示して、答えを入力してもらうやり方をしています。これを初めて以来、SPAM投稿は1度もなく、一方、まっとうな投稿はきちんと入ってきています。 - ついで、「メッセージ内へのURLの書き込みを禁止する」。 - つぎが「URL(http://~)の複数書き込みを禁止」。2回以上は禁止、というのでも結構効果あり。ただ、最近はURLの偽装やURLを書いてこないSPAM投稿も多い。 - 海外からのSPAM投稿に対しては、「NGワードの書き込みを禁止」もそれなりに効果ありですが、NGワードもころころと変えてきますし、日本語のSPAM投稿には対処が難しいのが難点。 - 「掲示板へ直接アクセスした場合の投稿を禁止する 」のには余りひっかかるSPAMMERはいないようです。

  • steel_gray
  • ベストアンサー率66% (1052/1578)
回答No.1

http://swanbay-web.hp.infoseek.co.jp/bbs_spam.html こちらが投稿spamに関する情報がまとまっていて、 改造コードのサンプルなどもあります。 掲示板とメールフォームでは違いもありますが参考になると思います。

関連するQ&A

  • 送受信が出来ないメールフォーム

    メールフォームの送信ボタンを押すと Internal Server Errorの画面になり、送受信が出来ません。 jcode.plとcgi-lib.plは書き直していません。 多分form.cgiの書き方が何か違うのだと思います。 下記がform.cgiの中身です。 #!/usr/bin/perl require 'cgi-lib.pl'; require 'jcode.pl'; &ReadParse(*formdata); $subject = "$formdata{'subject'}"; $name = "$formdata{'name'}"; $email = "$formdata{'email'}"; $email = "$formdata{'dayl'}" $12 = "$formdata{'12'}"; $13 = "$formdata{'13'}"; $to = '△@yahoo.co.jp'; $subject = 'メール'; &jcode'convert(*subject,'jis'); open(MAIL, "| /usr/sbin/sendmail -t"); print MAIL "To: $to\n"; print MAIL "From: $email\n"; print MAIL "Content-Type: text/plain;\n\n"; print MAIL "件名:\n$subject\n\nお名前:\n$name\n\nメールアドレス:\n$email\n\n生年月日:\n$day\n\n資料:\n$12\n\n担当者名:\n$13\n\nご相談内容:\n$message\n"; close(MAIL); print "Location: http://△.sakura.ne.jp/12.html\n\n"; exit; 初心者にも分かる様にどなたかご教授をお願いします。 print "Location: http://△.sakura.ne.jp/12.html\n\n"; 部分の12.htmlは送信後に表示するページです。

    • 締切済み
    • CGI
  • アンケート集計フォーム、チェックボックスでのデータ取得

    フォームから、テキストボックスと、プルダウンを使用してデータを取得するcgiに、 チェックボックスを加えようと思うのですが、うまくいきません。 どなたかご教授お願い致します。 入力が適切ならば、hiddenで書き込み 不適切ならばフォームを表示。 テキスト入力の場合 # email if ($e_email){ $t_email = "<input type=\"text\" size=\"20\""; }else{ $t_email = "$email<input type=\"hidden\""; } $t_email .= "name=\"email\" value=\"$email\">\n"; プルダウンの場合 # way if ($e_way){ $t_way = "<select size=\"1\" name=\"way\">\n"; $t_way .= "<option selected>連絡方法を選択して下さい\n"; $t_way .= "<option>E-mail\n"; $t_way .= "<option>電話\n"; $t_way .= "</select>\n"; }else{ $t_way = "$way<input type=\"hidden\" name=\"way\" value=\"$way\">\n"; チェックボックスでの分岐、value属性のある場合はどうなるのでしょうか?

    • ベストアンサー
    • CGI
  • URLに#を表示するには?

    初めまして。無料のCGI(掲示板)をDLして自分のHPで使用しているのですが「Res」ボタンをクリックするとスレッドの一番上に来てしまい、返信フォームが一番下にある為に使いづらいので改造を試みています。 とは言っても初心者なのでやり方自体が間違っているかもしれませんが。 返信フォーム付近に<a name=jump>タグを入力してあります、URLに「#jump」と手入力すれば思った事が出来るのですが以下のCGIにどの様に記述すれば良いのか教えてください。 print "<form action=\"$script\" method=GET>\n"; if($up_down){ print "<a href=\"#$mm[$x-1]\">▲前</a> <a href=\"#$mm[$x+1]\" class=\"ud\">▼次</a>"; $x++; } print "<input type=hidden name=mode value=new_html>\n"; print "<input type=hidden name=no value=$no>\n"; print "<input type=submit value='Res'> &nbsp; </td></form>\n"; 下から2行目の「=$no」の後に「#jump」と記述すると「#」が「%23」になってURLが出てきます。 これをURLで「#jump」と表示されるようにしたいのです。 下手くそな説明で申し訳ありませんがよろしくお願いします。

    • ベストアンサー
    • Perl
  • PHPフォームのスパム対策

    PHPフォームのスパム対策についてなのですが 氏名のふりがなをひらがな入力でチェックをしたいのですが 下記記述でうまくいきません。PHPの初心者なのでご教授いただけますでしょうか? ( PHPの一部抜粋ですが //20090403 in の箇所を追記しました。) //////////////// // メイン処理 // //////////////// if ($method == 3) { include($smtp_class); } @header("Content-Type: text/html; charset=EUC-JP"); if (isset($_POST['FORM'])) { //フォームからのデータを評価 if ($_POST['FORM']['NAME'] == "") { die('名前が入力されていません'); } //20090403 in if ($_POST['FORM']['FURIGANA'] == "") { die('ふりがなを ひらがなで入力してください。'); } if ($_POST['FORM']['EMAIL'] == "") { die('Eメールが入力されていません'); } if ($_POST['FORM']['MESSAGE'] == "") { die('メッセージが入力されていません'); } if (strlen($_POST['FORM']['MESSAGE']) > $max) { die('文字数が多すぎます'); } if ($_POST['FORM']['SUBJECT'] == "") { $_POST['FORM']['SUBJECT'] = '(untitled)'; //タイトルなしの場合 } //改行コードを<LF>に統一 $_POST['FORM']['MESSAGE'] = str_replace("\r\n", "\n", $_POST['FORM']['MESSAGE']); $_POST['FORM']['MESSAGE'] = str_replace("\r", "\n", $_POST['FORM']['MESSAGE']); //先頭と末尾のホワイトスペースを削除 $_POST['FORM']['MESSAGE'] = trim($_POST['FORM']['MESSAGE']); //メッセージ部分のフォーマット $_POST['FORM']['MESSAGE'] = "\n" . "----------------------------------------------------------------------\n" . $_POST['FORM']['MESSAGE']."\n" . "----------------------------------------------------------------------\n"; //メール本文の作成 $body = ""; //初期化 while (list($item, $value) = each($_POST['FORM'])) { if (get_magic_quotes_gpc()) { $value = stripslashes($value); } $body .= sprintf("%-8s", $item)." : ".$value."\n"; } //漢字コード変換( EUC → JIS ) if ($enable_EUCtoJIS) { $body = EUCtoJIS($body); $subject = '=?ISO-2022-JP?B?'.base64_encode(EUCtoJIS($_POST['FORM']['SUBJECT'])).'?='; $from_name = '=?ISO-2022-JP?B?'.base64_encode(EUCtoJIS($_POST['FORM']['NAME'])).'?='; $kana_name = '=?ISO-2022-JP?B?'.base64_encode(EUCtoJIS($_POST['FORM']['FURIGANA'])).'?='; } //20090403 in if (!mb_ereg("^[ぁ-ん]+$", $_POST['FORM']['FURIGANA'])) { $from = $kana_name." <".$_POST['FORM']['FURIGANA'].">"; } if (ereg("^[0-9A-Za-z._-]+@[0-9A-Za-z.-]+$", $_POST['FORM']['EMAIL'])) { $from = $from_name." <".$_POST['FORM']['EMAIL'].">"; } else { $from = $from_name." <".$to.">"; }    以下略 ------------ 御多忙のところ恐縮ですがよろしくお願いいたします。

    • ベストアンサー
    • PHP
  • フォームの確認画面について

    お世話になります。 現在アンケートフォームを作成し、そのデータをtxtファイルに保存するというプログラムを作成しました。そこでフォームに入力された確認画面を表示させ、確認画面で送信ボタンを押すと、データが蓄積されるプログラムに変えたいと思ってます。 今現在はフォームはhtml cgiはperlで作成してます。 実際にどのようにすればいいかが分かりません。 フォーム(html)→確認用フォーム(cgi)→蓄積用cgiという流れでいいのでしょうか? また、確認用のフォームには戻るボタンを作りたいのですが、戻った時に、入力したデータは保持しときたいのですが。 よろしくお願いいたします。 データ蓄積用cgiプログラム #! /usr/bin/perl require './cgi-lib.pl'; $answer = 31; $ansfile = "/tesuto.txt"; &ReadParse(*in); $name = "てすと"; for($n = 1; $n <= $answer; $n++ ) { $no[$n] = $in{"no$n"}; } open (FILE,">>$ansfile"); flock (FILE,2); print (FILE "\"", $name); for($i = 1; $i <= $answer; $i++ ) { $no[$i] =~ s/\"/""/g; print FILE "\"\,\""; print FILE $no[$i]; } print FILE "\"\n"; flock(FILE,8); close(FILE); print "Content-type: text/plain\n\n"; print "<HTML><BODY>\n"; print "<META http-equiv=\"refresh\" content=\"0;URL=http://○○○.html\">\n"; print "</body></HTML>"; exit;

    • ベストアンサー
    • CGI
  • 掲示板スパム対策(改造)1行追加でエラー

    書き込み文字が変換されるタイプの掲示板です。 1行追加、アップした後に、サーバーのエラーが出るのですが、 どこが悪いのかわかりません。 #HTMLドキュメントのヘッダー宣言 ~省略~ #投稿フォームを作成 ~省略~ print "<td align=center>名前</td>\n"; print "<td><input type=text size=34 name=name value=" . $COOKIE{'name'} . "></td>\n"; print "</tr>\n"; print "<tr>\n"; print "<td align=center>E-mail</td>\n"; print "<td><input type=text size=34 name=email value=" . $COOKIE{'email'} . "></td>\n"; print "</tr>\n"; print "<tr>\n"; print "<td align=center>見出し</td>\n"; #返信の場合は、見出しを挿入 if ($FORM{'flags'} eq 'return') { print "<td><input type=text size=34 name=subject value=RE:" . $FORM{'subject'} . "></td>\n"; } else { print "<td><input type=text size=34 name=subject></td>\n"; } print "</tr>\n"; print "<tr>\n"; print "<td align=center>内容</td>\n"; print "<td align=center><textarea name=comment rows=3 cols=34></textarea><br>\n"; if ($FORM{'flags'} eq 'return') { print "<input type=submit value=$FORM{'subject'}へ返信>\n"; print "<input type=hidden name=ress value=$FORM{'code'}>\n"; } else { print "<input type=submit value=新規投稿>\n"; } print "ガードコード<input type=text name="guard" size=8>\n"; #スパム対策用で追加●●●●●●●●●● print "</form>\n"; (TっT)

    • ベストアンサー
    • CGI
  • フォームの入力チェック処理について

    確認ボタンを押しエラーがあればエラーメッセージを出力し なければ確認画面に移りたいと考えているのですがうまくいきません。 具体的には 1:入力フォームを表示 2-1:送信ボタンを押しエラーがあればメッセージ出力 2-2:送信ボタンを押しエラーがなければhiddenのname="mode" value="confirm"を渡す hiddenの値はswitchのcase文の値でconfirmで確認画面を表示します。 入力フォームを表示する段階にてhiddenを渡しているのが原因なのは わかるのですがエラーチェックを通す際の構文がわかりません・・・ また、hiddenを消すとエラーチェックが通るのですが例えば名前を入力 しメールを入力しない状態で 送信ボタンを押すとメールの入力を促すエラーメッセージが表示され名前の入力も消えてしまいます。 これは回避できるのでしょか? 見づらいかと思うのですが下記のソースです。宜しくお願い致します。 function input() { if(isset($_POST{"submit"})) { if (empty($_POST["name"])) { $error_message[] = "お名前を入力して下さい。"; } if (empty($_POST["email"])) { $error_message[] = "メールアドレスを入力して下さい。"; }if (count($error_message)) { echo "<p style=\"color: #ff0000\">入力内容にエラーがあります。</p>\n"; foreach ($error_message as $message) { echo "<p style=\"color: #ff0000\">" . "・$message" . "</p>\n"; } } } echo "<form method=\"post\" action=\"" . $_SERVER['PHP_SELF'] . "\">\n"; echo "<table border=\"1\">\n"; echo "<tr>\n"; echo "<td>お名前</td>\n"; echo "<td><input type=\"text\" name=\"name\" size=\"20\"></td>\n"; echo "</tr>\n"; echo "<tr>\n"; echo "<td>メールアドレス</td>\n"; echo "<td><input type=\"text\" name=\"email\" size=\"20\"></td>\n"; echo "</tr>\n"; echo "<tr>\n"; echo "<td>メッセージ</td>\n"; echo "<td><textarea name=\"msg\" rows=\"5\" cols=\"40\"></textarea></td>\n"; echo "</tr>\n"; echo "<tr>\n"; echo "<td colspan=\"2\"><input type=\"submit\" name=\"submit\" value=\"内容を確認\"></td>\n"; echo "</tr>\n"; echo "</table>\n"; echo "<input type=\"hidden\" name=\"mode\" value=\"confirm\" />\n"; echo "</form>\n"; }

    • 締切済み
    • PHP
  • DBを用いたCGI認証スクリプト(perl、mysql)

    DBに一行一ユーザーの情報があり(メールアドレス 、パスワード)、 IDをメールアドレスとし、 入力したメールアドレスが登録されているか 入力したメールアドレスのパスワードがあっているか、 をチェックするスクリプトです。 初心者のためいろいろのサイトを見ながら作りましたが、下記のソースで何とか動いています。 が、これでよいのか(スマートかどうか)、もっと簡単な方法があるのかどうかをお聞きしたく、質問させていただきました。よろしくお願いいたします。 #!/usr/bin/perl use DBI; use CGI; require "cgi-lib.pl"; #フォームからIDとPWを受け取る &ReadParse(*form); $input_id= "$form{'アイディー'}"; $input_pw= "$form{'パスワード'}"; $TABLE_name = 'メールアドレス'; $form = CGI->new; $ret = eval{ $dbh = DBI->connect('DBI:*******************) }; if ( !$ret ) { print "接続エラーが発生しました\n"; exit(); } else{ print "OK\n"; $sql = "SELECT パスワード FROM $TABLE_name where メールアドレス='$input_id'"; $sth = $dbh->prepare($sql); if(!$sth->execute){ print "SQL実行エラー\n"; exit; } $num_rows = $sth->rows; if($num_rows==0){ print "このEmailは登録されていません。\n"; } else{ #ヒットしたemailの行にあるパスワード=$rec $rec = $sth->fetchrow_array(); #ヒットしたemailの行にある「パスワード=$rec」と入力したパスワードがマッチするかどうか if($rec eq $input_pw){ #認証OK!会員ページへ print "<br>認証OK!<br>"; } else{ #認証NG(Emailは登録されているが、登録したemailとパスワードが一致しない) print "パスワードが違います\n"; } } $sth->finish; $dbh->commit; $dbh->disconnect; }

    • ベストアンサー
    • Perl
  • ファイヤーフォックスでフォームが文字化けがします。

    お世話になります。 自分で作ったサイトですが、 入力フォームの氏名を書き込んで、それをクッキーに保存して、それを呼び出すと、入力した名前が文字化けしてしまいます。 自分で作ったといっても、無料配布のCGIです。 これはファイヤーフォックスの問題でしょうか? 私の環境は、Windows8.1 です。 ちなみに、その部分の内容は、次の通りです。 print "<FORM METHOD=\"POST\" ACTION=\"./bbs.cgi\" ENCTYPE=\"multipart/form-data\">\n"; print "<input type=\"hidden\" name=\"mode\" value=\"modify\">\n"; print "<input type=hidden name=\"no\" value=\"$main_no\">\n"; }else{ print "<FORM METHOD=\"POST\" NAME=\"F1mode\" ACTION=\"./bbs.cgi\" ENCTYPE=\"multipart/form-data\" onSubmit=\"return chuuikakunin()\">\n"; print "<input type=\"hidden\" name=\"mode\" value=\"add\">\n"; } 正直なところ詳しいことはよく分かりませんが、 onSubmit=\"return chuuikakunin()\" ↑これは、JavaScriptを使って名前の入力が無いとアラートで知らせるためのものだと思われます。 よろしくお願い致します。

  • phpを使ったメールフォームでメールが送信されない

    flash初心者です。 flash+phpを使い、メールフォームを作成しているのですが、 どうもメールが送信されないのです。 ボタンscript on (release) { getLoadVars = new LoadVars(); sendLoadVars.sendAndLoad("free.php", getLoadVars, "POST"); gotoAndPlay("sending"); } //別フレームに if (command == "end") { gotoAndStop("sendok"); } else if (command == "error") { gotoAndStop("senderror"); } else { gotoAndPlay("sending"); } phpの中身は 入力エラーチェックをして、OKだったら、DBにインサート するように書いてます そしてエラーだったら print "Content-type: text/plain\n\n"; print "command=error"; OKだったら print "Content-type: text/plain\n\n"; print 'command=end'; とプリントしています。 ※flashのテキスト入力オブジェクト(変数command)に出力させるようにしています。 以下のサイトを参考にして作ったのですが…。 http://www.game3rd.com/flash/f4/expert/mail/ エラーのフレームにも送信完了のフレームにも移動しなく、 ただ、送信中のフレームで止まっている状況です。 すみませんが、アドバイスお願いいたします。 flash pro8 winxp

専門家に質問してみよう