• ベストアンサー

PHPメールフォーム URLと半角英字のみの書き込み禁止

PHPメールフォームにスパム書き込みが多くなった為、対策したいのですが。 (1)テキストボックスにURLが書かれた時に、「URLの書き込みは出来ません」などのエラーの文言を返して、送信出来ないようにするためにはどのようなプログラムにすれば良いのでしょうか? (2)半角英語スパムが多いので、上と共にひらがななど2バイト文字を含んで無いと、エラーの文言を返して送信出来ないようにもしたのです。 今日一日すぐ返信出来るようにしていますので、『指示して頂ければすぐ追記もします。』 ぜひともご回答よろしくお願いします。

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

  • ベストアンサー
  • Suzi
  • ベストアンサー率38% (130/334)
回答No.5

 mb_send_mail で送る前に、通常、メールアドレスが正しいかどうか、またはメールアドレスやコメントが空欄などがないかチェックします。  そこのところで、メールアドレスが入っている変数名を$email、文面の変数名を$comment とした場合(ku1395さんがお使いになっているPHPの変数名は分かりません)、エラー表示のfunctionをPHPファイル最下部にでも作成しておきます。既存でありましたらそのfunctionに送ってください。  上記のチェックする最後のところにでも、 if( preg_match('/http/', $email) > '0' ) error( "URLの可能性があります"); if( preg_match('[/ぁ-ん]/', $comment) <= '0' ) error( "日本語ではないかも"); function error($msg){ echo "<html><body>\n"; echo "<center>\n"; echo $msg; echo "</center>\n"; echo "</body></html>\n"; exit; } とかだと良いと思います。 shift_jisのPHPは作ったことないので良くわかりません。 もしかしたら、yyr446さんが記されています mb_regex_encoding("UTF-8"); を出力した後に、if( preg_match('[/ぁ-ん]/', $comment) <= '0' ) error( "日本語ではないかも"); かもしれません。  こういうのは、小さなPHPファイルを作成して、そのパーツごとを記してチェックしてみると良いですよ。  例えば、Shift_jisでの、以下のようなtext.php を作成し、$email の ' ' の間にいろいろなのを記して、テストしてみるとかがあります。 <html> <body> <?php $email = ''; if( preg_match('/http/', $email) > '0' ) echo "URLの可能性がある"; else echo "URLではない"; ?> </body> </html>

ku1395
質問者

補足

yyr446さんのものを入力しますと。 「テキストにURLが含まれています。」と表示されている状態で、条件を変えても動作しませんでした。 理由は、私が基本的なPHPのルールを分かって無い為だと思います・・;; $txtdataと$matchesは、例えば、$txtdata = $_POST['mail'] というような形で代入すれば良いのでしょうか? 入れているのはフォームは下記です。 <?php header("Content-Type:text/html;charset=Shift_JIS"); ?> <?php $script ="sendmail.php"; $to = "xxx@xxx.com"; $sbj = "アンケート"; $chmail = 1; $jpage = 0; $next = "http://www.xxxx.com/"; $from_add = 1; $remail = 1; $resbj = "送信ありがとうございました"; $esse = 1; $eles = array('名前','年齢','性別','email','規約'); $sendm = 0; foreach($_POST as $key=>$var) { if($var == "eweb_submit") $sendm = 1; } // 文字の置き換え $string_from = "\"; $string_to = "ー"; // 未入力項目のチェック if($esse == 1) { $flag = 0; $length = count($eles) - 1; foreach($_POST as $key=>$var) { $key = strtr($key, $string_from, $string_to); if($var == "eweb_submit") ; else { for($i=0; $i<=$length; $i++) { if($key == $eles[$i] && empty($var)) { $errm .= "<FONT color=#ff0000>「".$key."」は必須入力項目です。</FONT><BR>\n"; $flag = 1; } } } } foreach($_POST as $key=>$var) { $key = strtr($key, $string_from, $string_to); for($i=0; $i<=$length; $i++) { if($key == $eles[$i]) { $eles[$i] = "eweb_ok"; } } } for($i=0; $i<=$length; $i++) { if($eles[$i] != "eweb_ok") { $errm .= "<FONT color=#ff0000>「".$eles[$i]."」が未選択です。</FONT><BR>\n"; $eles[$i] = "eweb_ok"; $flag = 1; } } if($flag == 1){ htmlHeader(); ?> 以下はメール送信内容など。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (4)

  • yyr446
  • ベストアンサー率65% (870/1330)
回答No.4

No1のyyr446です。 他の方から正規表現パターンの解答が既に出ています。 私も考えていたのですが、1つの正規表現パターン文で、 (1)httpの文字列を含まない かつ (2)ひらがなを1文字以上含む を表現できないかと悩みましたが、あきらめました。 とりあえずif文を2回使えば、 mb_internal_encoding("UTF-8"); mb_regex_encoding("UTF-8"); if (preg_match("/^(?!.*HTTP).+$/i",$txtdata,$matches) > 0){ if(mb_ereg_match(".*[あ-ん]+",$matches[0])){ print "OKです。"; }else{ print "テキストに不正な文字が含まれています。"; } }else{ print "テキストにURLが含まれています。"; } でできました。 否定の先読みをうまくつかえば、一つのパターンで出来るような気がするのですが、あまり正規表現に精通してないもので、申し訳ありません。 他の解答を待ちます(他人の質問に便乗してすみません)

全文を見る
すると、全ての回答が全文表示されます。
  • Suzi
  • ベストアンサー率38% (130/334)
回答No.3

1) URLなら、http:とかhttps:とかがあるので、 if( preg_match('/http/', $email) > '0' ) echo "URLの可能性があります";  でも、これだとhttpはないけど@のない、つまりメールじゃない記号も入力可能になってしまいます。  厳密には@マークの前に使って良い記号を含めた正規表現が必要かと思いますが。 2) ひらがなのない日本語はありえないとして、 if( mb_ereg('[ぁ-ん]', $comment) <= '0' ) echo "日本語ではないかも";

ku1395
質問者

補足

お返事ありがとうございます。 私のPHP理解レベルが低いのですが、具体的にプログラムとして動くようにフォームPHPの中に設置することが出来ませんでして・・ (ネット上の物を既存のフォーム動作PHPに記入などして)動作させることが出来ませんでした。 もし出来ましたら、動作する設置例をご指摘頂けますと、解決出来るかもしれません。 具体的にどういうフォームPHPで?というのが必要でしたら言って頂ければ追記します。一般的なフォームPHPで、sendmail使用、文字コードShift_JISの物です。

全文を見る
すると、全ての回答が全文表示されます。
回答No.2

URL> preg_match("/(http:\/\/|ttp:\/\/)/i",$text) または substr_count(strtolower($text), 'http') > 0 日本語> preg_match("/^[\x01-\x7e]+$/",$text) でどうでしょう。 配列に禁止語句を設定して、foreachで1つずつチェックに掛けるというのも有効だと思います

ku1395
質問者

補足

お返事ありがとうございます。 上と重複レスになるためご返信のお礼レスだけ。

全文を見る
すると、全ての回答が全文表示されます。
  • yyr446
  • ベストアンサー率65% (870/1330)
回答No.1

SPAM判定基準の仕様があいまいなような、一方厳しすぎるような なので漠然としていますが。 (1)URLの判定は、単に"http:"又は"HTTP:"の文字列があるかないか調べるだけでよいのですか? (2)数字や記号も2バイト文字でなければ×にするのですか? いずれにせよ正規表現で入力された内容をマッチさせて、マッチしたら エラーメッセージを返すという事ですね

ku1395
質問者

補足

>>(1)URLの判定は、単に"http:"又は"HTTP:"の文字列があるかないか調べるだけでよいのですか? はい、そうです。あれば送信されずエラーメッセージを出したいです。 >>(2)数字や記号も2バイト文字でなければ×にするのですか? こちらは、書き込みにひらがなが含まれてないと送信出来ないものにしたいです。 >>いずれにせよ正規表現で入力された内容をマッチさせて、マッチしたらエラーメッセージを返すという事ですね そうですね、(1)(2)に添わなければエラーメッセージを出し送信されない形が理想です。 エラーメッセージ部分は自分の作ったHTMLを表示出来れば尚良いですが、これについては出来る出来ないが分からないので、出来ればと言うところです。 ちなみに私のPHP理解度的には拾った物を組み合わせてる程度の初心者です。 ご回答よろしくお願いします。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • PHP フォームについて

    PHP初心者です。HTMLとPHPを使って、アンケートフォームを作っています。 ネットで色々と調べていたのですが、基本の構成がわからないので教えてください。 HTMLとPHPの別々のファイルで構成されているフォームと、HTMLにPHPを書き込みをしてHTMLの1つのファイルで構成しているものなどがありました。どの方法でやるとよいのでしょうか? また、同じ内容でもPHPの書き方が違うような感じがするのですが、PHPには同じ動作でも沢山の書き方があるのでしょうか?ウェブサイトによって書き方が違うので少し混乱しています。 [アンケートフォーム内容] テキスト・複数行のテキスト・メール・ラジオボックス・チェックボックス・添付ファイル(添付ファイルは難しいのであれば、無しにします)のフォームの部品をいれたいです。 [動作] 1、顧客がアンケートフォームの入力 2、入力内容を私のメールに転送する のシンプルな動作です。 また、ラジオボタンやチェックボックスをつけると、PHPの構文が難しくなるのでしょうか? 宜しくお願いします。

    • ベストアンサー
    • PHP
  • PHP5でメール送信フォームのURLを分らなくする

    PHP5でメール送信フォームのURLを分らなくする PHP5でメール送信フォームを作っています。 開発環境:Win7,Achache2 このファイルをファイル名、URLが分らなくする方法がわかりません。 例: http://kohhi.com/search?q=PHP%E3%80%8AB&src=IE-SearchBox&FORM=IE8SRC どのような仕組みで上記のような事ができるのでしょうか。 PHP、セキュアファイルで検索してもうまく検索できません。 サンプルプログラムなど、サイトを教えてくれるだけでも幸いです。

    • ベストアンサー
    • PHP
  • PHP版フォームメール

    メール送信フォームを管理画面で項目等を指定すれば自動で生成(HTMLを)できいくつでも簡単にフォームメールを作成できるPHP限定で探してます。 自動生成ということでフリーソフトでは流石になさそうですが最低限以下の3つを満たすシンプルなものでも構いません。どこかにありますでしょうか? ◆必須の機能 ・入力フォーム→確認画面→送信完了  の流れのフォームメール ・必須項目を設定できる ・フォーム送信後、ユーザと管理者へメールできる ・必須項目が未入力時のみ次画面でエラー画面を表示 ◆できれば欲しい機能 テキスト入力以外に、ラジオやチェックボックスやテキストエリアなども生成できる よろしくお願いします。

    • 締切済み
    • PHP
  • Access フォームのテキストボックスに半角英字のみで入力する設定は

    IME入力モードをテーブル・フォームともオフにしたのですがひらがな入力モードになってしまいます。 フォームのテキストボックスに半角英字のみで入力する設定としてプロパティのIME入力モードをオフにするやり方自体が間違っているのでしょうか。 それともATOKを使っているなど利用するパソコン側の問題でしょうか

  • PHPメールフォームの英語スパム対策 書き方

    サイトにPHPのメールフォームを設置しているのですが、半角英語文字の羅列と複数URLによるスパム書き込みに悩んでおります。 キャプチャ認証を使いたくなかった為、 http://note.phyllo.net/?eid=634535 上記の方が書いている2バイト文字チェックでスパム対策出来ないかと思ったのですが、そのまま記入しても動きません。 導入したいと思っていますのは、ewebサイトさんの下記のPHPメールフォームです。 http://php.eweb-design.com/1301_mail.html 何分知識不足の素人でして、具体的にどこの部分にどういう形で記入と指定して頂けると分かると思います。 丸2日対策自体を探しまわり答えが出ず疲弊しています。 お手数ですがご回答お願いします。

    • 締切済み
    • PHP
  • Javascriptで、フォームボタン押下(submit)せず、リンクURLを書き換える

     javascriptで、  1.フォームのテキストボックスに入れられた値を取得し、   例)テキストボックス入力 ; test  2.元々記述されているリンクURLをユーザがクリックした時、   例)元々のリンクURL ; <a href="www.google.co.jo?q= ~...  3."1"のテキストボックス内に記述された値を取得して、"2"のURLを書き換え、   例)テキストボックス内の文字をURLの一部に追記する ; <a href="www.google.co.jo?q=test  ~...  4.書き換えられた後のURLにユーザを飛ばす、  ・・・という事って出来るんでしょうか。  上記動作内でユーザの動作は、   テキストボックスに文字を入れる、という動作と、   リンクをクリックする、という動作のみです。  フォームのボタン押下後、というのであれば出来たんですが、上記の様な動作のコードが思い浮かびません・・・。PHPとかCGIではなく、Javascriptで何とか出来ないでしょうか。  お知恵拝借、よろしくお願いします。

  • PHPのメールフォーム

    無料版や有料版を貸し出しているサイトのメールフォームではなく、PHPを使用し自分でメールフォームを作成したいです。というのは、無料だと貸し出しているサイトのURLを載せなければいけないし、有料だとお金がかかるのが嫌・・・ということで自分で作成しようと思ったのですが知識がなく作成方法が分かりません・・・しかし、現在HPが数多くある中メールフォームのテンプレートぐらいあるんじゃないか?と期待しているのですが甘いでしょうか?(ー。ー;) もしよろしければ、そのような本やサイトがあれば紹介させてもらえませんか? ちなみに、 「記入画面」 ・名前 ・メールアドレス ・メールアドレス確認 ・サイトURL ・件名 ・本文 ↓ 「確認画面」 「エラー画面」 ↓ 「送信完了画面」 というふうにしたいです。

  • Webフォームのテキストボックスで半角指定は可能か

    Webフォームに、テキストボックスってあるじゃん。 ここで、テキストボックスをクリックしてアクティブにするだけで、半角にしたいです。 出来ますか?そんなの無理ですかね?JavaScriptとか埋め込んでも良いのですが。 全角文字を入力していたらエラーを返すことならば可能で、それはよく見るけど、それじゃ弱い。それよりは、強制的に半角に切り替えたいです。 あるいは、数字指定を徹底して、Alphabetの入力を受け付けないようにしたいです。ゼロとオー、イチとエルは形が似ていて見た目に分からないじゃん。 よくあるじゃん。入力が漢字ひらがなになっていると、自分でCapsキーとか半角/全角キーを押して、切り替えるんですよ。面倒だし、忘れちゃうし、気付かず全角で打ってたら消して書き直しじゃん。んで、半角数字をフォームで指定していてそれ以外は認めないのならば、自動で切り替えてあげれば良いのかと。 Webフォームの他に、エクセルでも良いです。ご存知でしたら、方法を教えて下さい。 1年くらい前に、ニュースになってましたよね。特別定額給付10万円のWeb申請で、役所は半角を指定しているのに、国民は全額で入力しちゃうんですよね。だから、本人照合の処理が進まなくなっちゃって給付が遅れ、ニュースになってましたよね。これをやっていれば、結構はスムーズになり、手間やスピードが変わるのかと。 <!DOCTYPE html> <html lang="ja"> <head><meta charset="utf-8"> <title>テキストボックス</title></head> <body> <form action="#" method="post"> <p>ABCコード(半角数字7桁)<br> <input type="text" name="address" size="7"></p> <p><input type="button" value="確認" id="button2"></p> </form> </body></html>

    • ベストアンサー
    • HTML
  • phpメールフォームが転送されません

    phpのメールフォームからのメールを受け取れない。OSはXP。ザンプ使用。送信しました画面は正常に動作しますが、受信ボックスに転送されません。php.iniは書き替えましたが、C;¥~xampp~sendmailの書き替えが済んでいません。よければ書き替え方をご教授下さい。よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • phpのシンプルなメールフォーム

    あるサイトにて、単一phpのメールフォームのソースをコピーし、使用としましたが、 設定したメールアドレスに、送信ボタンを押しましたが、 受信されません。  ・送信後、「メールを送信しました」と表示されます。  ・送信のあて先は、何も反応なし。  ・ソースの「●●@●●」はダミーです。 以下ソースです。原因がわかりますでしょうか。ご教授のほどよろしくお願いします。 ―――――――――――――――――――――――――――――――――――― <?php // 送信フラグ $send_flg = false; // エラーメッセージ $err_msg = array(); // 送信ボタンを押した後の処理 if ($_POST["post_flg"]) { // エラー if ($_POST["name"] == "") { $err_msg[] = "「お名前」は必須です"; } if ($_POST["email"] == "") { $err_msg[] = "「メールアドレス」は必須です"; } // エラーが無ければ送信 if (count($err_msg) == 0) { // 宛先 $mail_to = "●●@●●"; // 送信元アドレス $mail_from = "form@example.com"; // 件名 $mail_subject = "メールフォームから送信がありました"; // 本文 $mail_body = ""; $mail_body.= "■お名前\n".$_POST["name"]."\n\n"; $mail_body.= "■メールアドレス\n".$_POST["email"]."\n\n"; $mail_body.= "■コメント\n".$_POST["comment"]; // 送信処理 mb_language("Japanese"); mb_internal_encoding("UTF-8"); mb_send_mail($mail_to, $mail_subject, $mail_body, "From: <".$mail_from.">"); $send_flg = true; $_POST = array(); } } ?> <!DOCTYPE HTML> <html lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>メールフォーム</title> </head> <body> <?php // 初期フォーム表示 if (!$send_flg) { ?> <h1>メールフォーム</h1> <?php // エラーメッセージがある場合 if (count($err_msg) > 0) { ?> <p style="color:red;"> <?php foreach ($err_msg as $val) { ?> ※<?php echo $val ?><br> <?php } ?> </p> <?php } ?> <form action="mail.php" method="post"> <p> お名前<br> <input type="text" cols="30" name="name" value="<?php echo $_POST["name"] ?>"><br> </p> <p> メールアドレス<br> <input type="text" cols="30" name="email" value="<?php echo $_POST["email"] ?>"><br> </p> <p> コメント<br> <textarea name="comment" cols="50" rows="10"><?php echo $_POST["comment"] ?></textarea><br> </p> <input type="submit" name="post_flg" value="送信する"><br> </form> <?php // メール送信後の表示 } else { ?> <br><br><br><br>メールを送信しました。<br> <?php } ?> </body> </html> ――――――――――――――――――――――――――――――――――――

    • ベストアンサー
    • PHP