Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP] Anty-spam w formularzu kontaktowym
Nevildevil
post 22.06.2013, 12:18:55
Post #1





Grupa: Zarejestrowani
Postów: 13
Pomógł: 0
Dołączył: 12.11.2011

Ostrzeżenie: (0%)
-----


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.  
Go to the top of the page
+Quote Post
krzychu0808
post 22.06.2013, 12:44:58
Post #2





Grupa: Zarejestrowani
Postów: 428
Pomógł: 2
Dołączył: 1.04.2007
Skąd: Pogorzelica

Ostrzeżenie: (10%)
X----


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.

Ten post edytował krzychu0808 22.06.2013, 12:45:34
Go to the top of the page
+Quote Post
b4rt3kk
post 22.06.2013, 13:04:44
Post #3





Grupa: Zarejestrowani
Postów: 1 933
Pomógł: 460
Dołączył: 2.04.2010
Skąd: Lublin

Ostrzeżenie: (0%)
-----


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.


--------------------
Jeśli pomogłem, kliknij proszę 'pomógł'. Dzięki.
Go to the top of the page
+Quote Post
in5ane
post 22.06.2013, 13:22:11
Post #4





Grupa: Zarejestrowani
Postów: 1 335
Pomógł: 34
Dołączył: 9.11.2005
Skąd: Wrocław

Ostrzeżenie: (10%)
X----


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ą.

Ten post edytował in5ane 22.06.2013, 13:22:20


--------------------
> > > Tworzenie stron < < <
Go to the top of the page
+Quote Post
krzychu0808
post 22.06.2013, 13:28:48
Post #5





Grupa: Zarejestrowani
Postów: 428
Pomógł: 2
Dołączył: 1.04.2007
Skąd: Pogorzelica

Ostrzeżenie: (10%)
X----


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.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 25.06.2025 - 00:06