Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][SQL]zabezpieczenie logowania
Forum PHP.pl > Forum > Przedszkole
PiiiT
Witam, proszę o informację na temat zabezpieczenia strony logowania. Otóż mam stronę logowania, na tórej sprawdzam czy ciągi login i hasło wpisywane przez użytkownika są literami i cyframi, czy mają odpowiednnią długość (10 i 15 znaków). Pole hasła jest osobno szyfrowane 256bitowym kluczem. Przy sprawdzaniu w bazie czy login i hasło istnieje korzystam z '".htmlspecialchars($_POST["login"])."' który zgodnie z opisem usuwaja niebezpieczne znaki wprowadzane przez użytkownika typu \ / Znalazłem też informację że przy zabezpieczeniu strony należy również używać funkcji strip_tags, addslashes() i stripslashes() do odczytu czystego tekstu bez /. Czy funkcja htmlspecialchars nie spełnia tych funkcji? Co sądzicie o zabezpieczeniu logowania do katalogu udostępnianego przez przeglądarki (chodzi o autoryzację która wyświetla okno z przeglądarki z prośbą o podanie loginu i hasła coś jak logowanie do serwerów) - dzięki niemu mamy podobno pewność że łączymy się z odpowiednią bazą użytkownikiem który ma odpowiednie prawa? Co o tym sądzicie?
empathon
Jeśli oczekujesz audytu pokaż kod bądź daj linka do aplikacji.
Pisząc używam tego i tego nic nie przekazujesz bo najważniejsze jest właściwe użycie.
MWL
cóż ja mogę ci polecić stronkę naszego bledzia. Tam znajdziesz info na temat różnego typu zabezpieczeń. Poza tym pokaż kod...
PiiiT
Oto kod:

  1. <?php
  2.  
  3.  
  4.  
  5. if(empty($_SESSION["zalogowany"]))$_SESSION["zalogowany"]=0;
  6.  
  7. include 'conf.php';
  8.  
  9. function ShowLogin($komunikat=""){
  10.  echo "$komunikat<br>";
  11.  echo "<Table border = 0 rules=void align=center cellpadding=5 bgcolor=#96d2f2>";
  12.  echo "<form action='index.php' method=post>";
  13.  echo "<td colspan=3 bgcolor=#ececec align=center><img src=/baza/logo.png alt=logo></td></tr>";
  14.  echo "<td colspan=3 bgcolor=#96d2f2 align=center><strong>Panel logowania</strong> </td></tr>";
  15.  echo "<tr><td width=\"40%\" style=\"text-align: right\"><b>Login: </b></td><td><input type=text name=login></td></tr><br>";
  16.  echo "<tr><td width=\"40%\" style=\"text-align: right\"><b>Hasło: </b></td><td><input type=password name=haslo></td></tr><br>";
  17.  echo "<tr><td colspan=2 align=center><input type=submit value='Zaloguj!'></td></tr>";
  18.  echo "</form>";
  19.  echo "</Table>";
  20.  
  21. }
  22. $login = $_POST['login'];
  23. $pass = $_POST['haslo'];
  24. //print $nazwa;
  25. $zakod = md5($pass);
  26.  
  27. $login = strip_tags($_POST[login]);
  28. if(strlen($login) < 10){
  29. $login = addslashes($login);
  30. //POLECENIA ZAPISUJĄCE ZMIENNĄ $komentarz W BAZIE!
  31. }else{
  32. echo 'Twój login jest za długi!';
  33. }
  34.  
  35. $pass = strip_tags($_POST[pass]);
  36. if(strlen($pass) < 10){
  37. $pass = addslashes($pass);
  38. //POLECENIA ZAPISUJĄCE ZMIENNĄ $komentarz W BAZIE!
  39. }else{
  40. echo 'Twóje hasło jest za długie!';
  41. }
  42.  
  43. ?>
  44.  
  45. <html>
  46. <meta http-equiv="content-type" content="text/html; charset=utf-8">
  47. <head>
  48.  <title>Strona logowania</title>
  49. </head>
  50. <body bgcolor="#ececec">
  51.  
  52. <table>
  53. <tr>
  54. <?php
  55. if($_GET["wyloguj"]=="tak"){$_SESSION["zalogowany"]=0;echo "<meta http-equiv=\"refresh\" content=\"0;URL=index.php\">";}
  56. if($_SESSION["zalogowany"]!=1){
  57.  if(!empty($_POST["login"]) && !empty($_POST["haslo"])){
  58.      if(mysql_num_rows(mysql_query("select * from user where login = '".htmlspecialchars($_POST["login"])."' AND pass = '$zakod'"))){
  59.          echo "<meta http-equiv=\"refresh\" content=\"0;URL=menu.php\">";
  60.          $_SESSION["zalogowany"]=1;
  61.          }
  62.      else echo ShowLogin("Podano złe dane!!!");
  63.      }
  64.  else ShowLogin();
  65. }
  66. else{
  67.  
  68.  
  69. }
  70. ?>
  71. </tr>
  72. </table>
  73. </body>
  74. </html>
  75. <?php mysql_close();


I jeszcze jedno pytanie, czy można jakoś ukryć plik index.php w action? Tak żeby po wyświetleniu źródła strony nie było go widać?
empathon
Sprawdzanie długości loginu czy hasła nie ma nic wspólnego z bezpieczeństwem.
Czyszczenie z tagów w tym wypadku też niczego Ci nie daje. Używaj tego gdy podane przez użytkownika dane chce potem gdzieś wyświetlić (poczytaj o XSS).
Jedyną sensowną rzeczą jaką robisz jest addslashes ale tak naprawę nie wiele Ci to daje (patrz SQL injection).
Kolejną sprawą jest to, że używasz natywnych funkcji do łączenia się z bazą danych (sprawdź PDO).

Zapytanie do bazy danych powinno wyglądać tak:
  1. <?php
  2. $query = "select pass from user where login = $login";
  3. ?>

i dopiero potem sprawdzasz czy pass równy jest hashowi usykanemu z hasła w POST'cie (poczytaj o http://en.wikipedia.org/wiki/Password_salting ).

Jeśli chcesz mieć naprawdę bezpieczną stronę musisz również sprawdzić czy sesja tak naprawdę należy do Twojego użytkownika (Session Hijacking).

Notes:
http://www.sitepoint.com/blogs/2004/03/03/...ssion-security/
http://phpsec.org/projects/guide/4.html

Nie przestrasz się - należy dobierać środki do celu - jeśli skrypt zabezpieczenia kolekcji prywatnych lolcatów z pewnością wystarczy. Jeśli ma bronic systemu bankowego, sklepu - czeka Cię jeszcze długa droga. Powodzenia.

Ps. Na wortalu jest pare artów na ten temat.
Spawnm
to ma sens?
  1. <?php
  2. $login = $_POST['login'];
  3. $pass = $_POST['haslo'];
  4. //print $nazwa;
  5. $zakod = md5($pass);
  6.  
  7. $login = strip_tags($_POST[login]);
  8.  
  9. //....
  10.  
  11. if(!empty($_POST["login"]) && !empty($_POST["haslo"])){
  12.     if(mysql_num_rows(mysql_query("select * from user where login = '".htmlspecialchars($_POST["login"])."' AND pass = '$zakod'"))){
  13. ?>


chyba nie....
bliitz
http://pl.php.net/manual/pl/function.mysql...cape-string.php

zajrzyj tutaj
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.