Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Anty-spam w formularzu kontaktowym
Forum PHP.pl > Forum > Przedszkole
Nevildevil
Hej. Mam do Was prośbę. Czy mógłby ktoś przerobić ten skrypt, aby każdy użytkownik mógł wysłać wiadomość raz na jakiś czas, powiedzmy 5 minut? Byłbym bardzo wdzięczny smile.gif

  1.  
  2. <?php
  3. if (count($_POST))
  4. {
  5. ////////// USTAWIENIA //////////
  6. $email = 'hubosek98@gmail.com'; // Twój e-mail
  7. $subject = 'Film z lola'; // Temat maila
  8. $message = '<img src="thanks.png"><br><br><font color="yellow"><h3>Dziękuję za wysłanie filmu. W ciągu 24h zweryfikuję Twój film i wstawię na stronę.</font></h3>'; // Komunikat
  9. $error = 'Wystąpił błąd podczas wysyłania filmu.'; // Komunikat błędu
  10. $charset = 'iso-8859-2'; // Kodowanie
  11. //////////////////////////////
  12.  
  13. $head =
  14. "MIME-Version: 1.0\r\n" .
  15. "Content-Type: text/plain; charset=$charset\r\n" .
  16. "Content-Transfer-Encoding: 8bit";
  17. $body = '';
  18. foreach ($_POST as $name => $value)
  19. {
  20. if (is_array($value))
  21. {
  22. for ($i = 0; $i < count($value); $i++)
  23. {
  24. $body .= "$name=" . (get_magic_quotes_gpc() ? stripslashes($value[$i]) : $value[$i]) . "\r\n";
  25. }
  26. }
  27. else $body .= "$name=" . (get_magic_quotes_gpc() ? stripslashes($value) : $value) . "\r\n";
  28. }
  29. echo mail($email, "=?$charset?B?" . base64_encode($subject) . "?=", $body, $head) ? $message : $error;
  30. }
  31. else
  32. {
  33. ?>
  34. <form action="?" method="post">
  35. <table>
  36. <tr>
  37. </td>
  38. </tr>
  39. <tr>
  40. <td><font color="yellow">Twój email:</font></td>
  41. <td><input type="text" size="25" name="Email wysyłającego" /></td>
  42. </tr>
  43. <tr>
  44. <td><font color="yellow">Tytuł filmu</font></td>
  45. <td><input type="text" size="25" name="Tytuł filmu" /></td>
  46. </tr>
  47. <tr>
  48. <td><font color="yellow">Autor filmu:</font></td>
  49. <td><input type="password" size="25" name="Autor filmu" /></td>
  50. </tr>
  51. <tr>
  52. <td colspan="2">&nbsp;</td>
  53. </tr>
  54.  
  55. </table>
  56. </div>
  57. <br />
  58. <table>
  59. <tr>
  60. <td><font color="yellow">Opis filmu:</font></td>
  61. <td><textarea name="Opis filmu" cols="46" rows="6"></textarea></td>
  62. </tr>
  63. </table>
  64. <br /><br />
  65. <table align="center">
  66. <tr>
  67. <td><button type="reset">Zresetuj</button></td>
  68. <td><button type="submit">Dodaj</button></td>
  69. </tr>
  70. </table>
  71. </form>
  72. <?php
  73. }
  74. ?>
  75.  
krzychu0808
Można to zrobić na sesji. Wrzucać do sesji czas unixowy i przy następnym wysłaniu formularz sprawdzać czy minął określony czas od ostatniego wysłania. Minus tego rozwiązania jest taki że można ominąć zabezpieczenie czyszcząc dane przeglądarki. Jeżeli masz tam rejestrację i wysyłają to użytkownicy zarejestrowani to możesz do bazy danych wrzucać czas ostatniego wysłania formularza przez danego użytkownika.
b4rt3kk
Istnieje kilka rozwiązań:
- zapisanie IP użytkownika w bazie wraz z czasem wysłania wiadomości + sprawdzanie przy wysyłaniu
- jeśli użytkownik musi być zalogowany / zarejestrowany w systemie, to analogicznie, tyle że na podstawie danych konta (ID).
- ciasteczka (o określonej żywotności)
- rozwiązanie kolegi powyżej

Znalazłoby się jeszcze parę sposobów, mniej lub bardziej wydajnych.
in5ane
Jeśli na sesjach wybierzesz sobie sposób, to tak.
  1. session_start(); // na początku pliku
  2.  
  3. /* to poniżej to jest instrukcja warunkowa, która sprawdzi Ci, czy minęło 5 minut od ostatniego e-maila, czy nie */
  4. $time = time()+300;
  5. if (isset($_SESSION['lastMail']) && $_SESSION['lastMail'] <= $time) {
  6. // tutaj twój skrypt wysyłki
  7. $_SESSION['lastMail'] = time(); //to wrzucasz sobie po udanej wysyłce, tworzy Ci zmienną sesyjną z aktualnym czasem, czyli z godziną, o której wysłano e-mail
  8. }
  9. else
  10. {
  11. echo 'Od ostatniego e-maila nie minęło 5 minut, musisz poczekać.';
  12. }
Coś w ten deseń musisz kombinować. Oczywiście pod warunkiem, że decydujesz się, aby to działało na sesjach, jednakże ktoś może wyłączyć i włączyć przeglądarkę i wyśle e-maila, lub skasować historia (w tym sesje). Cookies byłoby bardziej efektywne, gdyż już wyłączenie przeglądarki nie wpłynie na to, ale również można skasować dane przeglądarki. Ewentualnie możesz jeszcze zapisywać do bazy lub pliku adres IP użytkownika i sprawdzać przed każdą wysyłką adres IP użytkownika czy istnieje w bazie, jak tak to sprawdzać jego czas ostatniej wysyłki. Wszystko na podobnej zasadzie działa, jakieś zadeklarowanie gdzieś zmiennej i sprawdzenie później czegoś instrukcją warunkową.
krzychu0808
Napisałem ci na szybko rozwiązanie na sesji tylko musisz sobie to zaimplementować w twoim kodzie.
  1. <?php
  2. $delay = 5;
  3. $wyslij = false;
  4. if (count($_POST)) {
  5. if (isset($_SESSION['czas'])){
  6. if(($_SESSION['czas']+$delay)<time()) {
  7. $_SESSION['czas']=time();
  8. $wyslij = true;
  9. }
  10. }
  11. else {
  12. $_SESSION['czas']=time();
  13. $wyslij = true;
  14. }
  15.  
  16. if($wyslij == true) {
  17. echo "Wysłano formularz";
  18. } else {
  19. echo "Nie wysłano. Jeszcze poczekaj: ";
  20. echo ($_SESSION['czas']+$delay)-time();
  21. }
  22. }
  23. ?>
  24. <form action="sesja.php" method="post">
  25. <input type="hidden" value="wyslij" name="wyslij" />
  26. <input type="submit" value="Wyslij"/>
  27.  
  28. <form>


Cytat(in5ane @ 22.06.2013, 14:22:11 ) *
Jeśli na sesjach wybierzesz sobie sposób, to tak.
  1. session_start(); // na początku pliku
  2.  
  3. /* to poniżej to jest instrukcja warunkowa, która sprawdzi Ci, czy minęło 5 minut od ostatniego e-maila, czy nie */
  4. $time = time()+300;
  5. if (isset($_SESSION['lastMail']) && $_SESSION['lastMail'] <= $time) {
  6. // tutaj twój skrypt wysyłki
  7. $_SESSION['lastMail'] = time(); //to wrzucasz sobie po udanej wysyłce, tworzy Ci zmienną sesyjną z aktualnym czasem, czyli z godziną, o której wysłano e-mail
  8. }
  9. else
  10. {
  11. echo 'Od ostatniego e-maila nie minęło 5 minut, musisz poczekać.';
  12. }
Coś w ten deseń musisz kombinować. Oczywiście pod warunkiem, że decydujesz się, aby to działało na sesjach, jednakże ktoś może wyłączyć i włączyć przeglądarkę i wyśle e-maila, lub skasować historia (w tym sesje). Cookies byłoby bardziej efektywne, gdyż już wyłączenie przeglądarki nie wpłynie na to, ale również można skasować dane przeglądarki. Ewentualnie możesz jeszcze zapisywać do bazy lub pliku adres IP użytkownika i sprawdzać przed każdą wysyłką adres IP użytkownika czy istnieje w bazie, jak tak to sprawdzać jego czas ostatniej wysyłki. Wszystko na podobnej zasadzie działa, jakieś zadeklarowanie gdzieś zmiennej i sprawdzenie później czegoś instrukcją warunkową.


O ile się nie mylę to w tym kodzie jeżeli użytkownik pierwszy raz będzie wysyłał formularz to dostanie informacje że musi poczekać. Bo skrypt wykryje że nie ma takiej zmiennej w sesji i wyświetli zawartość else.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.