PHPのメールフォーム 同一IPからの連続送信禁止

このQ&Aのポイント
  • PHPのメールフォームで同一IPからの連続送信を禁止する方法について教えてください。
  • セキュリティ対策のため、同じIPからの連続送信を禁止する機能を実装したいです。
  • 現在、PHPのメールフォームを作成中で、同一IPからの連続送信を制限する方法がわかりません。どなたか教えていただけませんか?
回答を見る
  • ベストアンサー

PHPのメールフォーム 同一IPからの連続送信禁止

現在、PHPのメールフォームを作っています。 セキュリティ対策の一環として 同一IPからの連続送信を禁止する機能を 実装しようと思っています。 例えば下記のような感じです。 ------------------------------ 同じIPから、 30分間に、 連続10回以上、 メールフォームの「入力内容確認ボタン」が押されたら、 「しばらくお待ちください」というメッセージを出して、 その後24時間は、そのIPからはメールフォームからの 送信が出来ないようにする ------------------------------ いろいろ調べてみましたが、 なかなか作り方が分かりません。 $_SERVER["REMOTE_ADDR"] あたりを使うのでしょうか?・・・ どなたかご存知の方がいたら 教えていただけないでしょうか? サンプルコードと一緒に ロジックを教えていただけると助かります。 どうぞよろしくお願いいたします。

  • PHP
  • 回答数2
  • ありがとう数2

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

  • ベストアンサー
  • 1minn
  • ベストアンサー率57% (52/90)
回答No.2

#1です PHPではSESSIONが切れる状態はiniファイルの設定に依存します。 また、session.cache_expireなどを使ってキャッシュの有効期限を変えてやることも可能です。 デフォルトであれば通常はブラウザを閉じたらSESSIONは破棄されます。 一定期間、cookieにSESSION IDを保持しておけばブラウザを閉じても、PCの電源を落としても再びそのページを開けばSESSIONは再開(保持していた値を参照)出来ます。 で、単純にPHPのSESSIONとクライアントのIPとは無関係です。 一般家庭で利用するような可変のIPであれば、多くの場合はルータに依存します。 ルータ側の設定によって、PCとの接続がきれた時点で現在使用してるIPを手放せば恐らく次回インターネットにつないだタイミングでIPは変わると思います。 変わるといっても一定の範囲内なので、たまたま同じIPと言う事もありえます。 そこら辺は契約している会社にも依存するので何とも言えないです。 なので、利用する個々のユーザーによってIPが変わるタイミングもまちまちです。 SESSIONが切れるタイミングでIPが変わる可能性があるのは、ブラウザを閉じた段階で 「通信切断」→「ルータ側でキャッシュクリア」→「次回接続時に再度IP取得」のようなパターンがありそうな気がしたので書いてみました。 (検証などはした事もないですので、勝手な想像です) ルーターも一般家庭で使う数千円から業務用の数万、数十万のものまでピンキリです。 それなりにいいやつはいろんな設定も出来ますので、あり得ない話ではないかな~ ってところです。 普通の家庭で無駄に高機能なルーター使う人も稀でしょうけど・・・

okfish
質問者

お礼

なるほど。 とても勉強になりました。 詳しい情報ありがとうございます。 とりえあえずはIPで判別しての制限は意味なさそうですね。 本当にいろいろありがとうございました。 もし、IP判別とは別に、連続送信の防御策などご存知でしたら 教えていただけると助かります。

その他の回答 (1)

  • 1minn
  • ベストアンサー率57% (52/90)
回答No.1

同一IPでの制限は難しい(というかあまり意味がない)ように思います。 たいがいの一般契約はIPが可変でしょうから、SESSIONを切ればいくらでもIPは変わります。 もしかしたらネット自体の接続を切れば変るのかな?ルーター再起動? まぁそんな感じなので、それほど意味はないですよ。やたらといやがらせする人が固定IPなら有効かもしれませんが。 一応やるなら、この程度であればファイルにIPのリストを書き込んでおいて、アクセスがあった時にファイルを読み込んで比較とか? // 書き込み $logfile = fopen($logfilename, "a"); fwrite($logfile, "IPアドレス\n"); fclose($logfile); // 取得~比較 $fileArray = file('ファイルパス'); foreach ( $fileArray as $v ) { if ( $v === $_SERVER['REMOTE_ADDR'] ) { echo '一致'; } } すんごい雑ですが・・・ 時間やら回数も考慮したいならファイルにアクセス日時書き込んで、ループでカウンタつければよいかと思います。

okfish
質問者

お礼

ご回答ありがとうございます。 また、サンプルコードもありがとうございます。 大変参考になります。 あと、1minnさんの言うとおり IPが可変なら確かに意味がないですよね。 そのあたりまったく考えていませんでした。 私も勉強不足であやふやなところがあるんですが、 セッションが切れると(一回メールフォームから送信完了すると)、 IPも変わってしまうのでしょうか? インターネットへの接続を「切断」→「再接続」しないと IPは変わらないような気がするのですが、いかがでしょう?

関連するQ&A

  • こんにちは。PHPでメールフォームを送信したいのですが、

    こんにちは。PHPでメールフォームを送信したいのですが、 メールが文字化けしてしまいます。 PHP初心者です。 時間をかけてゆっくりやりたいのですが、 仕事でやっているため、そうも言ってられず。。。 ======================================================= $msg= 'Name: '.$_POST['name'].'<br /> Email: '.$_POST['email'].'<br /> IP: '.$_SERVER['REMOTE_ADDR'].'<br /><br /> Message:<br /><br /> '.nl2br($_POST['message']).' '; $mail = new PHPMailer(); $mail->IsMail(); $mail->AddReplyTo($_POST['email'], $_POST['name']); $mail->AddAddress($emailAddress); $mail->SetFrom($_POST['email'], $_POST['name']); $mail->Subject = "A new ".mb_strtolower($_POST['subject'])." from ".$_POST['name']." | contact form feedback"; $mail->MsgHTML($msg); $mail->Send(); ========================================================================= 一部ですが、こちらを修正すればよいのでしょうか? 宜しくお願いいたします。

    • ベストアンサー
    • PHP
  • 送信者のIPを取得するには

    現在メールフォームを作っています。 送信者の情報を取得する作りにはしていません。 迷惑メールが届き出してからでは遅いので、 ホスト名やIPアドレスを取得するフォームにしたいのですが、 <INPUT TYPE="hidden" NAME="env_report" VALUE="取得したい情報の属性"> という記述をCGIファイルに書けばいいのでしょうか。 また、下記の記述をどこに書くのかも分かっていません。 REMOTE_HOST 送信者(入力者)のホスト名 REMOTE_ADDR 送信者(入力者)のIPアドレス どなたかご教授をお願いします。

  • PHPで作成したメールフォームへの画像挿入・送信

    PHPで作成したメールフォームに画像が挿入できて、その画像がメール送信できるような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でのメール送信フォーム

    現在、PHPメール送信フォームを作成しています。 SMTPを使用してフォームを作成したいのですが、SMTPをどのように組み込んだら良いのかいまいち分かりません。 私の環境は、Windows2000、Webサーバー『APACHE』、PHP『php-4.2.0-Win32』を使用しております。 どなたか分かる方がいましたら、どうぞよろしくお願いします。

    • 締切済み
    • PHP
  • PHPでメールフォームを作りたいのですが

    質問お願いします。 現在、ホームページを作っています。 ページから意見などを直接メールアドレスに遅れるようにフォームを設定したいと考えています。 とりあえずHTMLで書いたフォームは出来上がったので、あとはPHPの設定だけなのですが、どうもここで行き詰まってしまいました。 PHPを自分で組むのは難しそうなのでサンプルを改変して使おうと思っているのですが、改変しやすそうなサンプルが見つかりません。 何かオススメのサンプルや方法があれば教えてください。 よろしくお願いします。

    • 締切済み
    • PHP
  • IP/ホスト連続投稿チェック機能が上手く行かない。

    なんでだろ?? ###+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ## SUB >>> ホスト取得処理 ###+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ sub get_HostAgent { $Host = $ENV{'REMOTE_HOST'}; $Addr = $ENV{'REMOTE_ADDR'}; if ($Host eq '') { $Host = $Addr; } if ($Host eq $Addr) { $Host = gethostbyaddr(pack('C4',split(/\./,$Host)),2) || $Addr; } $H_A = "$Host"; } ホスト取得ルーチンにある変数で、 いろんな掲示板の中のP/ホスト連続投稿チェック機能だけ抜き出して、 もう何十個も試したけれど、上手くいきません。 カスタマイズしてる会員掲示板に、 IP/ホスト連続投稿チェック機能を付けたいのですが上手くいきません。 二重投稿チェックはあるのですが、、 ↓↓↓ #--二重投稿チェック--# if ($r1 eq "$name" && $r4 eq "$street<>$title" && $r5 eq "$comment") { &lock2; &error("二重投稿は禁止です"); } より極めるために、以下を利用したいのです。。 ↓↓↓ #--IP/ホスト連続投稿チェック--# if ($Addr = $ENV{'REMOTE_ADDR'} && $^T - $time < 120) { &lock2; &error("連続投稿はできません。<BR>時間をおいてから書き込みして下さい");} 宜しくお願い致します。 どこがおかしいのかサッパリです。 なんとか機能を追加できるようにお願いしますろ

    • 締切済み
    • CGI
  • 特定のIPアドレスでPHPを使ったメール送信ができません

    PEARのMailを使ってメールを送信するソースを作成しました。 IPアドレスを自動取得した場合はきちんとメール送信ができています。 しかし、外部からの利用を可能にするためのIPアドレスに変更すると送信処理に時間がかかり、送信処理を中断してしまいます。 この特定のIPアドレスがある同一LAN内にはたくさんのPCがつながっています。 もしかしてこれが原因なのでしょうか? 動作環境:Windows+Apache2.0.52+PHP4.4.2

    • 締切済み
    • PHP
  • PHPのフォームメール

    PHPでフォームメールを作っています。 「PENTA CREATION」というサイトの『お問い合せフォーム』の例をやってみました。 しかし、送信先のメールアドレスにメール内容が送信されません。 どうすれば、送信先にメール内容が送信されますか。

  • phpのフォームについて

    phpで問合せフォームを作成中なのですが、分からない点が3点あります。 ご教示お願い致します。 (1)問合フォームの入力項目の最後の送信ボタンに下記のコードで「submit」を入れると、入力項目である郵便番号を入れると自動で住所表示(Ajaxzip2を使用)する機能が作動しなくなります。「submit」を入力しないと自動表示されますが、データーは送信されません。 どうしたらよいのでしょうか。 【問合せフォームの入力画面のコード/HTML】 <form method="POST" action="visit Application.php" > <h3 class="taitoru11">問合せ</h3> <label for="name">お名前を入力して下さい</label> <input type="text" name="name" id="name" placeholder="例)山田value=""> <label for="number">電話番号</label> <input type="tel" name="tel" id="tel" placeholder="例)0123" value="">   <label for="mail">メールアドレス</label> <input type="text" name="mail" id="mail" placeholder="例)" value="">    <label for="zip">郵便番号&nbsp;&nbsp;※必須</label> <input type="text" name="zip" id="zip" value="" placeholder="xxx-xxxx"maxength="8" />     <label for="addr">住所</label> <input type="text" name="addr" id="addr" /> <label for="addr2">マンション・部屋番号</label> <input type="text" name="addr2" id="addr2" /> <label for="comment">その他コメント</label> <textarea id="comment" name="comment" placeholder="問合せ内容をご記入ください" value="" wrap="hard" ></textarea> <input type="submit" value="入力内容を確認する" data-inline="true"/> </form> (2)上記のコードにある<input type="submit" value="入力内容を確認する" data-inline="true"/> を入力すると、ボタンを押さなくても、入力項目でエンターを2回押すと、送信先に勝手に送信されてしまいます。 どうしてでしょうか? また、ボタンを押さないと送信されない様にするにはどうすればいいのでしょうか。 (3)(1)のデーターの送信先で、上記の「その他コメント」欄については改行表示をさせたく、下記の様に「nl2br」を使ってみましたが、改行されませんでした。どうしたらよいのでしょうか。 【問合せフォームの送信先のコード/PHP】 <dl> <dt>お名前</dt> <dd><?php print(e($_POST['name'])); ?></dd> <dt>電話番号</dt> <dd><?php print(e($_POST['tel'])); ?></dd> <dt>メールアドレス</dt> <dd><?php print(e($_POST['mail'])); ?></dd> <dt>郵便番号</dt> <dd><?php print(e($_POST['zip'])); ?></dd> <dt>住所</dt> <dd><?php print(e($_POST['addr'])); ?></dd> <dt>マンション・部屋番号</dt> <dd><?php print(e($_POST['addr2'])); ?></dd> <dt>その他コメント</dt> <dd><?php print(nl2br(e($_POST['comment']))); ?></dd> </dl> 何卒よろしくお願い致します。

    • ベストアンサー
    • PHP