Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] zabezpieczenie formularza przed email injection
Forum PHP.pl > Forum > Przedszkole
d4nny
Witam, chodzi o formularz kontaktowy/zamówienia. Ma działać na vel.pl. Wysyłając maila przy pomocy tego formularza na mój e-mail zamiast danych przysłał kawałek kodu html. Obsługa hostingu naisała że: "naglowki maila podawane w skrypcie funkcji mail() powinny byc oddzielane przez "\n", a nie "\r\n" - taka forme przyjmuja platformy unixowe". Zmieniłem to wg. wskazań no i już przychodzą prawidłowe dane ale podobno skrypt jest dziurawy, nie wiem jak go zabezpieczyc przed email injection czytalem o filtrach ale nie wiele tego w necie i nie wszystko dziala. Proszę o pomoc. Oto kod pliku zamowienie.php, kofu pliku z formularzem chyba nie ma potzreby wklejać.

  1. <?php
  2. $firma=$_POST['firma'];
  3. $imieinaz=$_POST['imieinaz'];
  4. $nazwaf=$_POST['nazwaf'];
  5. $adres=$_POST['adres'];
  6. $kod=$_POST['kod'];
  7. $miasto=$_POST['miasto'];
  8. $nip=$_POST['nip'];
  9. $tel=$_POST['tel'];
  10. $faks=$_POST['faks'];
  11. $email=$_POST['email'];
  12. $szkolenie=$_POST['szkolenie'];
  13. $liczba=$_POST['liczba'];
  14. $innaliczba=$_POST['innaliczba'];
  15.  
  16. $data=strftime(" %A, %d %B %Y");
  17. $nadawca_imie = "[Zgłoszenie ze strony]";
  18. $send_email ="d4nny89@gmail.com";
  19. $temat = "[Zgłoszenie ze strony] - Informacja o zgłoszeniu - zamówieniu";
  20. $headers = "MIME-Version: 1.0\n";
  21. $headers .= "Content-type: text/html; charset=iso-8859-2\n";
  22. $headers .= "From: $nadawca_imie <$email>\n";
  23. $body_mail = "<table width=600 border=0 cellpadding=1 cellspacing=2 align=center style=\"font-family: Verdana; font-size: 12px;\">
  24. <tr>
  25. <td colspan=2 align=center><b><u>".$temat."</u></b></td>
  26. </tr>
  27. <tr>
  28. <td colspan=2 align=center> </td>
  29. </tr>
  30.  
  31. <tr>
  32. <td width=166 align=right>Firma: </td>
  33. <td width=424><div align=\"justify\"><b>".$firma."</b></div></td>
  34. </tr>
  35.  
  36. <tr>
  37. <td width=166 align=right>Imię i Nazwisko: </td>
  38. <td width=424><div align=\"justify\"><b>".$imieinaz."</b></div></td>
  39. </tr>
  40.  
  41. <tr>
  42. <td width=166 align=right>Nazwa firmy: </td>
  43. <td width=424><div align=\"justify\"><b>".$nazwaf."</b></div></td>
  44. </tr>
  45.  
  46. <tr>
  47. <td width=166 align=right>Adres firmy: </td>
  48. <td width=424><div align=\"justify\"><b>".$adres."</b></div></td>
  49. </tr>
  50.  
  51. <tr>
  52. <td width=166 align=right>Kod pocztowy: </td>
  53. <td width=424><div align=\"justify\"><b>".$kod."</b></div></td>
  54. </tr>
  55.  
  56. <tr>
  57. <td width=166 align=right>Miasto: </td>
  58. <td width=424><div align=\"justify\"><b>".$miasto."</b></div></td>
  59. </tr>
  60.  
  61. <tr>
  62. <td width=166 align=right>NIP: </td>
  63. <td width=424><div align=\"justify\"><b>".$nip."</b></div></td>
  64. </tr>
  65.  
  66. <tr>
  67. <td align=right valign=top>Telefon(y): </td>
  68. <td align=left valign=top> <div align=\"justify\"><b>".$tel."</b></div></td>
  69. </tr>
  70.  
  71. <tr>
  72. <td align=right valign=top>Faks: </td>
  73. <td align=left valign=top> <div align=\"justify\"><b>".$faks."</b></div></td>
  74. </tr>
  75.  
  76. <tr>
  77. <td width=166 align=right>Adres e-mail: </td>
  78. <td width=424><div align=\"justify\"><b>".$email."</b></div></td>
  79. </tr>
  80.  
  81. <tr>
  82. <td width=166 align=right>Szkolenie: </td>
  83. <td width=424><div align=\"justify\"><b>".$szkolenie."</b></div></td>
  84. </tr>
  85.  
  86. <tr>
  87. <td width=166 align=right>Liczba osób poddanych szkoleniu: </td>
  88. <td width=424><div align=\"justify\"><b>".$liczba."</b></div></td>
  89. </tr>
  90.  
  91. <tr>
  92. <td width=166 align=right>Podaj inną liczbę, jeśli przekracza ona 10 osób: </td>
  93. <td width=424><div align=\"justify\"><b>".$innaliczba."</b></div></td>
  94. </tr>
  95.  
  96. <tr>
  97. <td colspan=2 align=center> </td>
  98. </tr>
  99.  
  100. <tr>
  101. <td colspan=2 align=center>Data przeslania zgłoszenia: $data</td>
  102. </tr>
  103.  
  104. </table>";
  105.  
  106. mail($send_email,$temat,$body_mail,$headers);
  107.  
  108. print "<br><center>Zgłoszenie zostało wysłane</center>";
  109. print "<br><center>skontaktujemy się z Tobą wkrótce</center>";
  110. ?>
camikazee
Musisz wprowadzić dodatkowe funkcje walidacji danych z poszczególnych inputów. Możesz jeszcze dołożyć tokena i myślę, że te rozwiązania w dużej mierze rozwiążą te problemy smile.gif Walidacje najlepiej za pomocą wyrażeń regularnych, dość mocno filtruj, to będziesz miał pewność, że zatrzymasz niechciane ataki.
d4nny
tylko jak mam zastosować filtry, może jakiś kod podasz?
marcin.pospiech
W takim przypadku musisz zobaczyć, czy w danym inpucie nie znajdują się pewne znaki.

  1. <?php
  2.  
  3. if (eregi("r", $email) || eregi("\n", $email)) {
  4. die('Prawdopodobnie ktoś chce wstrzyknąć spam!');
  5. }
  6.  
  7. ?>


Taki kod pomoże wykryć Ci wstrzykiwany spam w MIME.
d4nny
ale to tzreba zastosować do każdego pola formularza ? np.

  1. <?php
  2. $firma=$_POST['firma'];
  3. if (eregi("r", $email) || eregi("\n", $email)) {
  4. die('Prawdopodobnie ktoś chce wstrzyknąć spam!');
  5. }
  6.  
  7. $imieinaz=$_POST['imieinaz'];
  8. if (eregi("r", $email) || eregi("\n", $email)) {
  9. die('Prawdopodobnie ktoś chce wstrzyknąć spam!');
  10. }
  11. ?>
help_mee
no tak.... ale możesz po zdefiniowaniu zmiennych:
  1. <?php
  2. $firma=$_POST['firma'];
  3. $imieinaz=$_POST['imieinaz'];
  4. $nazwaf=$_POST['nazwaf'];
  5. $adres=$_POST['adres'];
  6. $kod=$_POST['kod'];
  7. $miasto=$_POST['miasto'];
  8. $nip=$_POST['nip'];
  9. $tel=$_POST['tel'];
  10. $faks=$_POST['faks'];
  11. $email=$_POST['email'];
  12. $szkolenie=$_POST['szkolenie'];
  13. $liczba=$_POST['liczba'];
  14. $innaliczba=$_POST['innaliczba'];
  15. if (eregi("r", $email) || eregi("\n", $email)) {
  16. die('Prawdopodobnie ktoś chce wstrzyknąć spam!');
  17. }
  18. if (eregi("r", $imieinaz) || eregi("\n", $imieinaz)) {
  19. die('Prawdopodobnie ktoś chce wstrzyknąć spam!');
  20. }
  21. ...
  22. ?>

itd. smile.gif
Pilsener
Przepuszczaj np. z pola "miasto" tylko znaki alfanumeryczne, sprawdzaj wszystko co się da. Zastosuj filtry i zabezpieczenia opisane np. w tym temacie http://forum.php.pl/index.php?showtopic=94213 - w ostateczności "przepisz kod z obrazka", aczkolwiek nie jest to zalecane, to ostateczność.
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.