Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: formularz email + prosty token
Forum PHP.pl > Forum > PHP
derbich
Mam działający formularz do wysyłania emaili ze strony internetowej. Chciałbym go zabezpieczyć tokenem. Stworzyłem pięć obazków gif + kod na stronie ale nie działa mi on. Czy możecie spojrzeć i podpowiedzieć gdzie popełniłem błąd? oto kod:
  1. <?php
  2. $_SESSION['token'] = '';
  3. ?>
  4. <?php
  5. for($i=0;$i<5;$i++) {
  6. $liczba = rand(0,5);
  7. $_SESSION['token'] .= $liczba;
  8. $img .= '<img src="'.$liczba.'.gif" />';
  9. }
  10. ?>
  11. <?php
  12.  
  13. if ($_POST['bt'] == "submit") {
  14. if (($_POST['email'] != "") AND ($_POST['tytul'] != "") AND ($_POST['tresc'] != "") AND ($_POST['cod'] == $_SESSION['token'])) {
  15. $send = mail("contact@contact.com",$_POST['tytul'],$_POST['tresc'],"From: gallery webside <".$_POST['email'].">");
  16. if ($send)
  17. header("Location: sent.html");
  18. else
  19. $message = "<font size='2px' color='ff4500' face='arial'> Server error, message did not sent. Please try again.</font>";
  20. } else
  21. $message = "<font size='2px' color='ff4500' face='arial'>All fields required, please check and try again.</font>";
  22. }
  23.  
  24. ?>


  1. <meta name="generator" content="Bluefish 2.0.0" >
  2. <meta name="author" content="" >
  3. <meta http-equiv="content-type" content="text/html; charset=UTF-8">
  4. <meta name="Robots" content="noindex">
  5. <link rel="Shortcut icon" href="../graph/icon.png">
  6. <style type="text/css">
  7. <!--
  8. td {
  9. font-size: 11px; color: #ff7d4d; font-family: arial;
  10. }
  11. span {
  12. font-size: 8px; color: #ff7d4d; font-family: arial;
  13. }
  14. -->
  15. </head>
  16. <br><br>
  17. <table align="center" border="0">
  18. <td height="22px"><sup>*</sup>E-mail: </td>
  19. <td colspan="1" rowspan="3" valign="top">
  20. <form action="" method="post">
  21. <input type="text" name="email" value="<?php echo $email; ?>"><br>
  22. <input type="text" name="tytul" value="<?php echo $tytul; ?>"><br>
  23. <input type="text" name="cod"><?php echo $img; ?><br>
  24. <textarea name="tresc" cols="65" rows="14" ><?php echo $tresc; ?></textarea><br>
  25. <sup>*<span>Required</span></sup>
  26. <div align="right"><input type="submit" name="bt" value="submit"></div>
  27. </form>
  28. <div align="center"><?php echo $message ?></div>
  29. </td>
  30. </tr>
  31. <tr>
  32. <td height="22px"><sup>*</sup>Title:</td>
  33.  
  34. </tr>
  35. <tr>
  36.  
  37. <td height="210px" valign="top"><div style="position: relative; left: 0px; top: 55px;"><sup>*</sup>Mesage:</div> </td>
  38. </tr>
  39. </body>
  40.  


Wszystko to w jednym pliku "email.php". Podejrzewam, że coś jest nie tak z tą częścią: ($_POST['cod'] == $_SESSION['token']) ale za cholerę nie wiem co smile.gif

Z góry dziękuję;
AlexDeLarge
Po prostu ponownie generujesz ciąg znaków zamiast brać go z sesji ($_SESSION['token'] = ''; i kilka następnych linii na początku).
derbich
Próbuję na wszystkie sposoby ale nic z tego nie wychodzi. Najdziwniejsze jest to, że nawet jak nie wpiszę nic w komórkę to i tak wysyła maila.
Gligamesh
czyli wysyła pusty formularz ?

$_POST[''] != "" popracuj na tym, zobacz czy może zadziała Ci strlen($_POST['']) > 1

derbich
Witam;

Glupio sie przyznac ale za cholere nie umiem sobie z tym poradzic. Probowalem juz wszystkich kombinacji, ktore wydawaly sie sensowne.
pozdrawiam;
bleblok
Po pierwsze - co znaczy webside ?

Po drugie:
zerujesz token za każdym razem (nawet przy sprawdzaniu formularza)
  1. $_SESSION['token'] = '';


i ustawiasz go na nowo
  1. $_SESSION['token'] .= $liczba;


a dopiero potem sprawdzasz czy się tokeny zgadzają, z tym że sprawdzasz nowo wygenerowany token ze starym, który wyświetliłeś graficzkami.

Możesz zrobić tak:

  1. <?php
  2. if ( !isset($_POST['bt']) || $_POST['bt'] != "submit") {
  3. $_SESSION['token'] = '';
  4.  
  5.  
  6. for($i=0;$i<5;$i++) {
  7. $liczba = rand(0,5);
  8. $_SESSION['token'] .= $liczba;
  9. $img .= '<img src="'.$liczba.'.gif" />';
  10. }
  11.  
  12. }else {
  13. if (($_POST['email'] != "") AND ($_POST['tytul'] != "") AND ($_POST['tresc'] != "") AND ($_POST['cod'] == $_SESSION['token'])) {
  14. $send = mail("contact@contact.com",$_POST['tytul'],$_POST['tresc'],"From: gallery webside <".$_POST['email'].">");
  15. if ($send)
  16. header("Location: sent.html");
  17. else
  18. $message = "<font size='2px' color='ff4500' face='arial'> Server error, message did not sent. Please try again.</font>";
  19. } else
  20. $message = "<font size='2px' color='ff4500' face='arial'>All fields required, please check and try again.</font>";
  21. }
  22.  
  23. ?>
derbich
Działa!
Wielkie dzięki za pomoc;


Mam jeszcze jedno pytanie: zastosowałem funkcję
  1. value="<?php echo $email; ?>"
aby przy błędnym wpisaniu kodu lub przy niewypełnieniu któregoś z wymaganych pól formularz nie był wyczyszczany. Niestety nic to nie daje i za każdym razem trzeba wszystkie pola wypełniać od nowa. Jak można temu zapobiec? smile.gif
pozdrawiam;

Napotkałem kolejny problem. Gdy wysyłam stronę na serwer to przy wczytywaniu otrzymuję taką informację:

Warning: session_start() [function.session-start]: Cannot send session cookie - headers already sent by (output started at /websites/123reg/LinuxPackage21/cr/oz/ie/croziergreen.com/public_html/beta/pages/email.php:1) in /websites/123reg/LinuxPackage21/cr/oz/ie/croziergreen.com/public_html/beta/pages/email.php on line 2

Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at /websites/123reg/LinuxPackage21/cr/oz/ie/croziergreen.com/public_html/beta/pages/email.php:1) in /websites/123reg/LinuxPackage21/cr/oz/ie/croziergreen.com/public_html/beta/pages/email.php on line 2

Dodam, że na moim komputerze nie ma tego problemu.
Z góry dziękuję za pomoc smile.gif
pozdrawiam;
greycoffey
Mała sprawa. Zamieszczasz kilka obrazków, z którymi bot sobie świetnie poradzi. Co za problem wyciąć kawałek z obrazkami, a następnie wyrażeniem regularnym wyciągnąć stamtąd liczby - jeśli chcesz się dobrze zabezpieczyć, musi być to jeden obrazek. Zobacz: http://pornel.net/captcha

Do tego kolejna sprawa związana z bezpieczeństwem. Przechowujesz wartość tokena w sesji, której identyfikator przechowujesz w ciasteczku. Jeśli usuniesz ciasteczko, skrypt wygeneruje nowy identyfikator, przez co $_SESSION['token'] = ''; - tak więc jeśli zostawisz pole, do którego masz wpisać token, i usuniesz to ciasteczko, uda się przejść przez to sprawdzanie.

Dwa ważne błędy. Albo robisz coś bezpieczne w powiedzmy 99,99% - gdzie ten 00,01% to czysty przypadek, albo korzystasz z gotowych rozwiązań (reCaptcha: http://www.google.com/recaptcha).
derbich
Witam;
Dzięki za pomoc. Chciałem skorzystać z "własnego' rozwiązania bo po prostu wygląda lepiej. Trudno, za słaby jestem na to więc trzeba będzie skorzystać z gotowego rozwiązania.
pozdrawiam;
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.