PHPメールフォームにスパム書き込みが多くなった為、対策したいのですが。
(1)テキストボックスにURLが書かれた時に、「URLの書き込みは出来ません」などのエラーの文言を返して、送信出来ないようにするためにはどのようなプログラムにすれば良いのでしょうか?
(2)半角英語スパムが多いので、上と共にひらがななど2バイト文字を含んで無いと、エラーの文言を返して送信出来ないようにもしたのです。
今日一日すぐ返信出来るようにしていますので、『指示して頂ければすぐ追記もします。』
ぜひともご回答よろしくお願いします。
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>
この回答への補足
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();
?>
以下はメール送信内容など。
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が含まれています。";
}
でできました。
否定の先読みをうまくつかえば、一つのパターンで出来るような気がするのですが、あまり正規表現に精通してないもので、申し訳ありません。
他の解答を待ちます(他人の質問に便乗してすみません)
No.3
- 回答日時:
1) URLなら、http:とかhttps:とかがあるので、
if( preg_match('/http/', $email) > '0' ) echo "URLの可能性があります";
でも、これだとhttpはないけど@のない、つまりメールじゃない記号も入力可能になってしまいます。
厳密には@マークの前に使って良い記号を含めた正規表現が必要かと思いますが。
2) ひらがなのない日本語はありえないとして、
if( mb_ereg('[ぁ-ん]', $comment) <= '0' ) echo "日本語ではないかも";
この回答への補足
お返事ありがとうございます。
私のPHP理解レベルが低いのですが、具体的にプログラムとして動くようにフォームPHPの中に設置することが出来ませんでして・・
(ネット上の物を既存のフォーム動作PHPに記入などして)動作させることが出来ませんでした。
もし出来ましたら、動作する設置例をご指摘頂けますと、解決出来るかもしれません。
具体的にどういうフォームPHPで?というのが必要でしたら言って頂ければ追記します。一般的なフォームPHPで、sendmail使用、文字コードShift_JISの物です。
No.1
- 回答日時:
SPAM判定基準の仕様があいまいなような、一方厳しすぎるような
なので漠然としていますが。
(1)URLの判定は、単に"http:"又は"HTTP:"の文字列があるかないか調べるだけでよいのですか?
(2)数字や記号も2バイト文字でなければ×にするのですか?
いずれにせよ正規表現で入力された内容をマッチさせて、マッチしたら
エラーメッセージを返すという事ですね
この回答への補足
>>(1)URLの判定は、単に"http:"又は"HTTP:"の文字列があるかないか調べるだけでよいのですか?
はい、そうです。あれば送信されずエラーメッセージを出したいです。
>>(2)数字や記号も2バイト文字でなければ×にするのですか?
こちらは、書き込みにひらがなが含まれてないと送信出来ないものにしたいです。
>>いずれにせよ正規表現で入力された内容をマッチさせて、マッチしたらエラーメッセージを返すという事ですね
そうですね、(1)(2)に添わなければエラーメッセージを出し送信されない形が理想です。
エラーメッセージ部分は自分の作ったHTMLを表示出来れば尚良いですが、これについては出来る出来ないが分からないので、出来ればと言うところです。
ちなみに私のPHP理解度的には拾った物を組み合わせてる程度の初心者です。
ご回答よろしくお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- JavaScript 助けてください!スパムメールがとんでもなく大量に届きます。 3 2023/08/10 16:32
- PHP どうして送信されないのでしょうか? 1 2022/12/09 05:23
- Gmail gmail から docomo メールに送信できません 4 2022/06/25 00:41
- Excel(エクセル) PowerQueryに詳しい方教えてください(Office365) 1 2022/07/24 21:11
- その他(ネットショッピング・通販・ECサイト) moonwalkbabyで注文されて届いた方いますか? 2 2023/04/12 23:31
- 求人情報・採用情報 今日、ホテルのアルバイトに、タウンワークから応募しました。 すると、会社からGメールが届き、事前登録 1 2022/03/31 23:40
- Amazon Amazonショッピングのアプリで中々サインイン出来なくて困っています。 メールアドレスとパスワード 1 2023/04/09 23:04
- 予備校・塾・家庭教師 高校2です。 東進の志作文の提出が必須の校舎に通っています。先程連絡があり、明日が提出期限らしいので 2 2023/05/29 23:05
- JavaScript フォームが空欄の時にフォームの外をクリックすると、エラーが出るコードを調べています。 1 2023/06/25 11:51
- Access(アクセス) Accessのテキストボックスの入力文字制限 1 2023/01/18 20:43
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Excelで数字のみを2倍3倍にする...
-
正規表現でシングルクォーテー...
-
Smartyを使用した、テンプレー...
-
VBAを使ってHTMLソースから特定...
-
、"(ダブルクォーテーション)...
-
preg_matchでエラーが出ます。
-
PHPで変数から1行目だけを取得...
-
エスケープ文字の復帰(¥r)と...
-
VBAのコマンドボタンの文字列の...
-
ソースコードの1行が長いとき...
-
C++で空Enterの入力を判...
-
カンマの含まれる文字列の数値...
-
Excel VBAからBeckyを起動して...
-
文字の入力で横バー上段、中断...
-
VBSで"をエスケープする文字は?
-
JAVA System.out.println の ...
-
POSTで改行コードを受け渡すには
-
改行を読み飛ばす
-
半角記号、全角記号を含む正規...
-
jsp 改行コードで改行させて表...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAを使ってHTMLソースから特定...
-
、"(ダブルクォーテーション)...
-
preg_matchでエラーが出ます。
-
PHPで変数から1行目だけを取得...
-
PHPの「ereg」って何の略で...
-
PHPで あるフォルダ内の、特定...
-
PHPの正規表現で住所を分けるに...
-
Excelで数字のみを2倍3倍にする...
-
正規表現で「0」のみ抽出
-
住所から特定の文字列、数値を...
-
PHPで<a>タグ内からURLと文字を...
-
正規表現で特定のHTMLタグのク...
-
正規表現で、半角大文字と半角...
-
正規表現でシングルクォーテー...
-
正規表現パターンの記入方法に...
-
preg_matchでのマッチが正しく...
-
Smartyで部分一致
-
正規表現を使いimgタグ内から幅...
-
電話番号のチェック ハイフン...
-
php 正規表現で(ただし○○は除...
おすすめ情報