Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [MySQL][PHP] filtrowanie danych z formularzy - bezpieczeństwo.
Doody
post
Post #1





Grupa: Zarejestrowani
Postów: 22
Pomógł: 0
Dołączył: 21.09.2008

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


Kiedyś napisałem prosty CRM który działał ale był skrajnie niebezpieczny, tzn nie ma żadnego filtrowania danych przesyłanych z formularzy ani też tych zapisywanych w bazie.
Teraz zająłem się właśnie kwestią bezpieczeństwa aby mój twór stał się w końcu przydatny.

Na pierwszy ogień poszła kwestia panelu logowania i tu pytanie: czy sprawdzenia hasła i loginu jak poniżej jest Waszym zdaniem wystarczająco bezpieczne:
  1. <?php
  2. include('db_con.php'); //łączy z serwerem i wybiera bazę danych
  3. if(isset($_POST['login']) || isset($_POST['haslo'])){ //sprawdza czy hasło lub login zostały wprowadzone i przesłane metodą POST
  4. session_start(); //rozpoczyna sesję
  5. $zapytanie = "SELECT * FROM biz_user WHERE p_login = '".trim($_POST['login'])."'"; // wybiera z bazy MySQL rekordy z komórką p_login równą podanemu loginowi
  6. if(preg_match('/^[a-zA-Z0-9.\-_]+\@[a-zA-Z0-9.\-]+\.[a-z]{2,4}$/D', trim($_POST['login'])) && mysql_num_rows(mysql_query($zapytanie)) > 0){ // sprawdza czy ilość znalezionych rekordów jest większa od zera oraz czy login będący adresem e-mail jest zgodny z odpowiadającym mu wyrażeniem regularnym
  7. $zapytanie = "SELECT * FROM biz_user WHERE p_login = '".$_POST['login']."'&& p_haslo = '".$_POST['haslo']."'"; // wybiera z bazy MySQL rekordy z komórką p_haslo równą podanemu hasłu i komórką p_login równą podanemu loginowi
  8. if(preg_match('/[^\/\'\`\"\n\s\\\\]{2,20}$/D', $_POST['haslo']) && mysql_num_rows(mysql_query($zapytanie)) > 0){ // sprawdza czy ilość znalezionych rekordów jest większa od zera
  9. $zapytanie = "SELECT * FROM biz_user WHERE p_login = '".$_POST['login']."' LIMIT 1"; // pobiera używane w sesji dane użytkownika
  10. while($wiersz=mysql_fetch_array(mysql_query($zapytanie))){
  11. $_SESSION['user_id'] = $wiersz['p_id']; //zapisuje ID użytkownika w zmiennej sesyjnej
  12. $_SESSION['user'] = $wiersz['p_imie'].' '.$wiersz['p_nazwisko']; //zapisuje imię i nazwisko użytkownika w zmiennej sesyjnej
  13. $_SESSION['status'] = $wiersz['p_status']; //zapisuje ststus użytkownika w zmiennej sesyjnej
  14. break;
  15. }
  16. $_SESSION['zalogowany'] = true;
  17. header("Location: lista_firm.php");
  18. }
  19. else{
  20. header('Location: index.php?log_error=2');
  21. }
  22. }
  23. else{
  24. header('Location: index.php?log_error=1');
  25. }
  26. }
  27. else{
  28. <center>
  29. <br />
  30. <br />
  31. <img src="picture/logo.png">
  32. <br />
  33. <br />
  34. <h3>Logowanie do systemu</h3>
  35. ';
  36. if (isset($_GET['log_error'])){
  37. $log_error=$_GET['log_error'];
  38. if ( $log_error == 1 ) echo '<b>Nie istnieje taki użytkownik! </b><br />';
  39. if ( $log_error == 2 ) echo '<b>Podane hasło jest nieprawidłowe! </b><br />';
  40. }
  41. <form action="index.php" method="post">
  42. <br />
  43. Login: <input type="text" name="login" size="30"/><br/>
  44. <br />
  45. Hasło: <input type="password" name="haslo" size="30"/><br/>
  46. <br />
  47. <input class="przycisk" type="submit" value="WEJŚCIE" /><br/>
  48. </form>
  49. </center>
  50. ';
  51. }
  52. ?>


Zakładam że loginem jest adres e-mail a hasło nie może zawierać znaków \ / ' ` " \n \s


Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
Doody
post
Post #2





Grupa: Zarejestrowani
Postów: 22
Pomógł: 0
Dołączył: 21.09.2008

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


Czy teraz jest ok?
  1. if(isset($_POST['login']) || isset($_POST['haslo'])){
  2. if(!preg_match('/^[a-zA-Z0-9.\-_]+\@[a-zA-Z0-9.\-]+\.[a-z]{2,4}$/D', trim($_POST['login'])))
  3. header('Location: index.php?log_error=1');
  4. else
  5. $clean['login']=trim($_POST['login']);
  6. if(!preg_match('/[^\/\'\`\"\n\s\\\\]{2,20}$/D', trim($_POST['haslo'])))
  7. header('Location: index.php?log_error=1');
  8. else
  9. $clean['haslo']=trim($_POST['haslo']);
  10.  
  11. $zapytanie = "SELECT * FROM biz_user WHERE p_login = '".$clean['login']."'";
  12. if(mysql_num_rows(mysql_query($zapytanie)) > 0){
  13. $zapytanie = "SELECT * FROM biz_user WHERE p_login = '".$clean['login']."'&& p_haslo = '".$clean['haslo']."'";
  14. if(mysql_num_rows(mysql_query($zapytanie)) > 0){
  15. while($wiersz=mysql_fetch_array(mysql_query($zapytanie))){
  16. $_SESSION['user_id'] = $wiersz['p_id'];
  17. $_SESSION['user'] = $wiersz['p_imie'].' '.$wiersz['p_nazwisko'];
  18. $_SESSION['status'] = $wiersz['p_status'];
  19. break;
  20. }
  21. $_SESSION['zalogowany'] = true;
  22. header("Location: lista_firm.php");
  23. }
  24. else{
  25. header('Location: index.php?log_error=2');
  26. }
  27. }
  28. else{
  29. header('Location: index.php?log_error=1');
  30. }
  31. }


Wkleiłem tylko część odpowiedzialną za przetwarzanie danych.
Go to the top of the page
+Quote Post

Posty w temacie


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

 



RSS Aktualny czas: 8.10.2025 - 20:18