Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Zabezpieczenie formularza
Forum PHP.pl > Forum > Przedszkole
spikerx
Już klęczę nad tym ponad 2 godziny i niestety jestem zmuszony do napisania tego tematu, mimo, że temat już wałkowany kilka set razy to ja nie mogę znaleźć rozwiązania dla mojej sprawy. Chodzi o odświeżanie wysłanego już formularza. Chcę skorzystać ze skryptu header ale już tyle kombinacji próbowałem, że po prostu nie mam siły, bo nic nie działa :/

  1. <?
  2. if(isset($_POST["sender"])) {
  3.  
  4. $imie = $_POST['imieinazwisko'];
  5. $adres = $_POST['adreszamieszkania'];
  6. $pesel = $_POST['numerpesel'];
  7. $email = $_POST['email'];
  8. $telefon = $_POST['telefon'];
  9. $rodzajkursu = $_POST['rodzajkursu'];
  10. $angielski = $_POST['jezykangielski'];
  11. $gluchoniemi = $_POST['gluchonieme'];
  12.  
  13.  
  14. // Potwierdzenie dla użytkownika
  15. $reply_subject = 'xxxxxxxxxxx';
  16. $reply_body = 'Otrzymaliśmy twoją wiadomość';
  17. $reply_email = 'xxxxxxxxxxx';
  18.  
  19. // Wysłanie do xxx
  20.  
  21. $to = 'xxxxxxxxxxxxx';
  22. $from = $imie . "<" . $email . ">";
  23. $subject = 'xxxxxxxxxxxxxxxxxxxxxx';
  24. $body = "\n\nImię i Nazwisko: " . $imie .
  25. "\n\nAdres zamieszkania: " . $adres .
  26. "\n\nNumer Pesel: " . $pesel .
  27. "\n\nEmail: " . $email .
  28. "\n\nTelefon: " . $telefon .
  29. "\n\nRodzaj kursu: " . $rodzajkursu .
  30. "\n\nJęzyk angielski: " . $angielski .
  31. "\n\nGłuchoniemy: " . $gluchoniemi ;
  32.  
  33.  
  34. $coding = "Content-Type: text/plain; charset=utf-8 \nContent-Transfer-Encoding: 8bit";
  35. if(mail($to, $subject, $body, "From: " . $from . "\n" . $coding))
  36. {
  37. // potwierdzenie nadawcy
  38. if(mail($email, $reply_subject, $reply_body, "From: " . $reply_email . "\n" . $coding))
  39. {
  40. echo "<p class=\"dziekujemy\">Dziękujemy za wysłanie formularza!</p>";
  41.  
  42. }
  43. else
  44. {
  45. echo('<p class=\"dziekujemy\">Błąd podczas wysyłania wiadomośći</p>');
  46. }
  47. }
  48. }
  49.  
  50. require_once("zapisyform.php");
  51.  
  52. ?>



Oraz plik do formularza
  1. <div id="form" <? if(isset($_POST['sender'])) { echo "style=\"display:none;\"";}
  2. ?>>
  3. <form id="form1" name="form1" method="post" action="">
  4. <input type="hidden" name="sender" value="true" />
  5.  
  6. <fieldset> <legend>Zapisz się już dziś!</legend> <ul>
  7.  
  8.  
  9. <li><span id="sprytextfield1">
  10. <label for="imieinazwisko3">Imię i Nazwisko</label>
  11. <input type="text" name="imieinazwisko" id="imieinazwisko3" tabindex="1" />
  12. <span class="textfieldRequiredMsg">Wymagana jest wartość.</span></span></li>
  13. <li><span id="sprytextfield2">
  14. <label for="adreszamieszkania">Adres zamieszkania</label>
  15. <input type="text" name="adreszamieszkania" id="adreszamieszkania" tabindex="2" />
  16. <span class="textfieldRequiredMsg">Wymagana jest wartość.</span></span></li>
  17. <li><span id="sprytextfield3">
  18. <label for="numerpesel">Numer PESEL</label>
  19. <input name="numerpesel" type="text" id="numerpesel" tabindex="3" maxlength="11" />
  20. <span class="textfieldRequiredMsg">Wymagana jest wartość.</span><span class="textfieldInvalidFormatMsg">Za mało znaków.</span><span class="textfieldMinCharsMsg">Nieprawidłowy PESEL</span><span class="textfieldMaxCharsMsg">Nieprawidłowy PESEL</span></span></li>
  21. <li><span id="sprytextfield4">
  22. <label for="email">E-mail</label>
  23. <input type="text" name="email" id="email" tabindex="4" />
  24. <span class="textfieldRequiredMsg">Wymagana jest wartość.</span><span class="textfieldInvalidFormatMsg">Nieprawidłowy format.</span></span></li>
  25. <li><span id="sprytextfield5">
  26. <label for="telefon">Telefon komórkowy</label>
  27. <input type="text" name="telefon" id="telefon" tabindex="5" />
  28. <span class="textfieldRequiredMsg">Wymagana jest wartość.</span><span class="textfieldInvalidFormatMsg">Nieprawidłowy format.</span></span></li>
  29. <li><span id="spryselect1">
  30. <label for="rodzajkursu" class="formLeft">Rodzaj kursu</label>
  31. <select name="rodzajkursu" class="formRight" id="rodzajkursu" tabindex="6">
  32. <option>Kategoria A - Motocykl</option>
  33. <option>Kategoria B - Samochód</option>
  34. </select>
  35. </span></li>
  36. <li>
  37. <input name="jezykangielski" type="checkbox" id="dodatkoweinformacje" tabindex="7" />
  38. <label for="jezykangielski">Szkolenie w języku angielskim</label>
  39.  
  40. </li>
  41. <li>
  42. <input name="gluchonieme" type="checkbox" id="gluchoniemi" tabindex="8" />
  43. <label for="gluchonieme">Szkolenie osób głuchoniemych</label>
  44.  
  45. </li>
  46. <li><span id="sprycheckbox1">
  47.  
  48. <input name="przetwarzanie" type="checkbox" id="przetwarzanie" tabindex="9" /> <label for="przetwarzanie">Wyrażam zgodę na przetwarzanie danych osobowych w celu realizacji zamówienia.<font color="#FF0000">*</font><br />
  49. <span class="checkboxRequiredMsg">pole wymagane.</span></label>
  50.  
  51. <br /> </span></li>
  52. </ul>
  53. <p>&nbsp;</p>
  54. <p>
  55. <input type="submit" name="przycisk" id="przycisk" value="Wyślij" />
  56. </p>
  57. </fieldset>
  58. </form></div>


Formularz działa, po wysłaniu pojawia się Dziękujemy za wysłanie formularza! jednak chcę, żeby automatycznie strona się przeładowała, ponieważ po kliknięciu F5 ten sam wypełniony formularz jest ponownie wysyłany
valkirek
Po wysłaniu formularza możesz dać sesję uźytkkownikowi z konkretnym komunikatem i przekierowaniem spowrotem na strone z formularzem i wyswietlasz komunikat z sesji
lobopol
Musisz zrobić:
1. Na początku sprawdzasz czy w sesji nie ma wiadomości do wyświetlenia, jak jest wyświetlasz i kasujesz z sesji
2. po poprawnym wysłaniu forma zapisujesz wiadomosc do wyswietlenia z sesji
3. Używasz header() do przekierowania na tą samą stronę
spikerx
Cytat(valkirek @ 3.01.2014, 07:28:41 ) *
Po wysłaniu formularza możesz dać sesję uźytkkownikowi z konkretnym komunikatem i przekierowaniem spowrotem na strone z formularzem i wyswietlasz komunikat z sesji


Właśnie o to mi chodzi, komunikat jest, ale nie wiem jak z tym przekierowaniem :/

Dodatkowo, nie wiem czy tutaj mogę dodać ale mam wysuwany tekst po kliknięciu i po wstawieniu skryptu nie działa mi walidacja formularza.

///////////////// TEKST WYSUWANY ////////////////////

  1. <script type="application/javascript">
  2. $().ready(function() {
  3. $('div.more').hide().before('<br><a class="zapisyclass" href="">Jak zapisać się na kurs prawa jazdy?&raquo;</a>')
  4. .prev().toggle(function() {
  5. $(this).next().slideDown();
  6. }, function() {
  7. $(this).next().slideUp();
  8.  
  9. });
  10. });


//////// SILNIK FORMULARZA //////////////

i na końcu przed </body> ustawienia walidacji

  1. <script type="text/javascript" language="javascript">
  2. $(document).ready(function() {
  3. $(".box_skitter_large").skitter();
  4. });
  5. var sprytextfield1 = new Spry.Widget.ValidationTextField("sprytextfield1", "none", {validateOn:["blur", "change"]});
  6. var sprytextfield2 = new Spry.Widget.ValidationTextField("sprytextfield2", "none", {validateOn:["blur", "change"]});
  7. var sprytextfield3 = new Spry.Widget.ValidationTextField("sprytextfield3", "integer", {validateOn:["blur", "change"], minChars:11, maxChars:11});
  8. var sprytextfield4 = new Spry.Widget.ValidationTextField("sprytextfield4", "email", {validateOn:["blur", "change"]});
  9. var sprytextfield5 = new Spry.Widget.ValidationTextField("sprytextfield5", "phone_number", {validateOn:["blur", "change"], format:"phone_custom", pattern:"000-000-000", useCharacterMasking:true});
  10. var spryselect1 = new Spry.Widget.ValidationSelect("spryselect1", {isRequired:false, validateOn:["blur", "change"]});
  11. var sprycheckbox1 = new Spry.Widget.ValidationCheckbox("sprycheckbox1", {validateOn:["blur", "change"]});
  12. </script>



Z tego co już się dowiedziałem to chodzi o kolejność i o "konflik", próbowałem
Kod
jQuery.noConflict();

ale mi nie działa albo w złym miejscu to użyłem
Turson
Cytat
Właśnie o to mi chodzi, komunikat jest, ale nie wiem jak z tym przekierowaniem :/

Przecież lobopol odpowiedział, że zamiast header refresh dać header location
Crozin
Coś słabo te dwie godziny wykorzystałeś, skoro pierwszego z brzegu rozwiązania nie znalazłeś: http://en.wikipedia.org/wiki/Post/Redirect/Get
spikerx
Cytat(Turson @ 3.01.2014, 17:16:43 ) *
Przecież lobopol odpowiedział, że zamiast header refresh dać header location


stosowałem
  1. header("Location: /zapisy.php");

Jednak bez skutku

Jednakże teraz nawet header nie pomoże bo pierwszy problem jaki się teraz pojawił to brak walidacji formularza sad.gif

Edit: Z walidacja już sobie poradziłem, ale nadal nie mogę z tym header sad.gif

Jest ktoś w stanie pomóc, bo jestem w kropce sad.gif Próbuje i nic mi nie idzie :/
Turson
Jakiś błąd wyskakuje czy coś?
com
albo adres bezwzględny albo
  1. header("Location: ./zapisy.php");

wink.gif
spikerx
dodaje

  1. {
  2. echo "<p class=\"dziekujemy\">Dziękujemy za wysłanie formularza!</p>";
  3. header("Location: zapisy.php");
  4.  
  5. }
Turson
I co sie wtedy dzieje??
nospor
No ale nie mozesz dawac zadnego tekstu gdy robisz HEADER LOCATION.
Raz ze to niepoprawne, a dwa ze to bez sensu, bo jak niby ktos ma zobaczyc tekst ktory od razu znika...
spikerx
Właśnie nic nie dzieje, po prawnie wyświetla Dziękuje za wysłanie formularza ale na tym stoi
nospor nawet jak usune

  1. echo "<p class=\"dziekujemy\">Dziękujemy za wysłanie formularza!</p>";


To sama strona się nie przeładowuje
Turson
Zgaduje, że masz wyłączone raportowanie błędów i nie wywala błędu "Header already sent" i dlatego przekierowanie nie działa.

Dodaj na początku
  1. error_reporting(E_ALL);error_reporting(-1);

jeśli moje prognozy się sprawdzą z tym błędem to na początku daj

a na samym końcu
nospor
Cytat
nospor nawet jak usune
Ale nie chodzi tylko o te jedna linijke przed. Chodzi o wszystko co wysylasz do przegladarki. Nie moze isc nic a nic
spikerx
hmm, dodałem jedynie na początku
  1. error_reporting(E_ALL);error_reporting(-1);


Taki mam kod:
  1. if(mail($email, $reply_subject, $reply_body, "From: " . $reply_email . "\n" . $coding))
  2. {
  3. echo "<p class=\"dziekujemy\">Dziękujemy za wysłanie formularza!</p>";
  4. header("Location: zapisy.php");
  5. }


I jak wypełnię formularz, pojawia się Dziękujemy za wysłanie itd. a jak odświeżę strone to powraca mi do formularza, czyli chyba już dobrze jest

Jednak nie działa, coś w google chrome mi się zmieniło, bo na internet explorer jest to samo. Błędu nie wyświetla, a może poprzez require_once w zewnetrznym pliku dam header i wywołam go jeżeli użytkownik wypełni formularz, będzie to trybiło?
Turson
To żadna różnica czy z zewnętrznego pliku czy nie. Poza tym zauważ, że strona się przekieruje zanim użytkownik zobaczy komunikat
spikerx
Własnie powinna, Turson dodałem jeszcze ob_start itd, tak jak proponowałeś i niestety nic to nie zmieniło, chyba, że ja coś źle robię
com
pokaż kod jak to zrobiłeś wink.gif
spikerx
  1. <?
  2. error_reporting(E_ALL);error_reporting(-1);
  3. if(isset($_POST["sender"])) {
  4.  
  5. $imie = $_POST['imieinazwisko'];
  6. $adres = $_POST['adreszamieszkania'];
  7. $pesel = $_POST['numerpesel'];
  8. $email = $_POST['email'];
  9. $telefon = $_POST['telefon'];
  10. $rodzajkursu = $_POST['rodzajkursu'];
  11. $angielski = $_POST['jezykangielski'];
  12. $gluchoniemi = $_POST['gluchonieme'];
  13.  
  14.  
  15. // Potwierdzenie dla użytkownika
  16. $reply_subject = 'Zapis na kurs ze strony xxxxxxxx';
  17. $reply_body = 'Otrzymaliśmy twoją wiadomość';
  18. $reply_email = 'xxxxxxxxxxxxx';
  19.  
  20. // Wysłanie do Pilota
  21.  
  22. $to = 'xxxxxxxxxxx';
  23. $from = $imie . "<" . $email . ">";
  24. $subject = 'Zapis na kurs ze strony xxxxxxxxxxxxxx';
  25. $body = "\n\nImię i Nazwisko: " . $imie .
  26. "\n\nAdres zamieszkania: " . $adres .
  27. "\n\nNumer Pesel: " . $pesel .
  28. "\n\nEmail: " . $email .
  29. "\n\nTelefon: " . $telefon .
  30. "\n\nRodzaj kursu: " . $rodzajkursu .
  31. "\n\nJęzyk angielski: " . $angielski .
  32. "\n\nGłuchoniemy: " . $gluchoniemi ;
  33.  
  34.  
  35. $coding = "Content-Type: text/plain; charset=utf-8 \nContent-Transfer-Encoding: 8bit";
  36. if(mail($to, $subject, $body, "From: " . $from . "\n" . $coding))
  37. {
  38. // potwierdzenie nadawcy
  39. if(mail($email, $reply_subject, $reply_body, "From: " . $reply_email . "\n" . $coding))
  40. {
  41.  
  42. header("Location: zapisy.php");
  43. }
  44. else
  45. {
  46. echo('<p class=\"dziekujemy\">Błąd podczas wysyłania wiadomośći</p>');
  47.  
  48. }
  49. }
  50. }
  51.  
  52. require_once("zapisyform.php");
  53. ?>


Tylko nie bijcie smile.gif

Pomozecie?
Petre
Nie wiem czy dobrze zrozumiałem, chcesz po wysłaniu formularza podziękować userowi, a potem przekierować go na X stronę/podstronę.
Dlaczego nie użyjesz np JS do tego, który uruchomisz np po 5 s od załadowania strony ? Po co headera w to mieszać skoro nie działa ?
spikerx
Tak koledzy z forum radzili smile.gif) Z js to tym bardziej nie wiem jak smile.gif
YourFrog
Przyznaje się bez bicia że przeleciałęm powierzchownie wątek więc moja odpowiedź mogła paść / autor zmienił podejście

@Topic
Z tego co zrozumiałem po 1 poście chodzi ci o odświeżenie już wysłanego formularza (domyślnie taki formularz prześle się ponownie). Jeżeli oto chodzi masz kilka możliwości

1. Przekierowanie użytkownika na inną pod stronę po obrobieniu formularza (ma to na celu "zgubienie" danych tak aby "F5" nie pytało o ponowne przesłanie formularza)
2. Zrobić w formularzu ukryte pole tekstowe. Jest to rozwiązanie nazywane po prostu tokenem.
3. Zablokować formularz przed ponownym przesłaniem (Zauważyłem że u mnie w pracy z ipada gdy miałeś wolne łącze udawało się pomimo tokena przesłać kilka razy ten sam formularz, wydaje mi się że to wina tego że sesje są odkładane dopiero po zakończeniu działania skryptu ale to inny temat akurat).



Ja na twoim miejscu połączyłbym sposób nr 2 z sposobem nr 3 (jest on prosty zakładając że używasz JQuery).

2.
Generujesz token
  1. $_SESSION['token'] = md5(time() . rand(0, 10000));


Dodajesz do formularza pole
  1. <input type="hidden" name="token" value="<?php echo $_SESSION['token']; ?>" />



Tam gdzie sprawdzasz czy nadesłano poprawny formularz
  1. $isCorrectToken = ($_SESSION['token'] == $_POST['token']);


A po upewnieniu się że formularz cały był ok. I dodaniu do bazy czy co tam danych zerujesz token
  1. $_SESSION['token'] = '';


Dzięki takiemu działaniu masz pewność że osoba prześle ci tylko raz formularz (nawet jeżeli po wysłaniu odświeży go to nie będzie się zgadzał token)

3.
Poniższy kod zabezpiecza formularz przed szybkim dbl klikiem na guziku wysyłającym (co przy wolnych łączach powoduje dwa przesłania i zdarza się że zabezpieczenie oparte o token zawodzi)
  1. $('form').submit(function(){
  2. if( $(this).hasClass('sender') )
  3. return false;
  4.  
  5. $(this).addClass('sender');
  6. return true;
  7. });
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.