Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [skrypt] bezpieczeństwo - ograniczony dostęp
Forum PHP.pl > Inne > Oceny
swierszcz
Witam
Prosiłbym o ocenę mojego rozwiązania pod kątem bezpieczeństwa. Szybciej i przyjemniej było mi napisać coś swojego niż godzinami odnajdywać się w czyimś kodzie (brak wcześnijszego kontaktu z PHP). Mam nadzieję, że ma to prawo działać - czyli bronić dostępu do części serwisu.
Dodam, że to moje pierwsze pisanie w PHP więc proszę o zrozumienie jeśli stosowałem nie najkrótsze rozwiązania. Mam nadzieję, że wszystko jest jasne.
Czekam na opinie. Pozdrawiam.


  1. plik restricted.php
  2. <?
  3.  
  4. switch(@$ad){ //$ad - zmienną przekazywane jest żądane miejsce docelowe, w części ogólnodostępnej serwisu jest to nazwa pliku bez dopełnienia
  5. case'': $nag="Brak strony!";  $ad="brak"; break; //$nag to nazwa strony - wykorzystuję ją w treści
  6. case'druki':  $nag="Przydatne druki"; $ad="secur_druki";  break; //secur_druki.html to docelowa strona do wczytania
  7. case'adresy': $nag="Przydatne aderesy"; $ad="secur_adresy"; break;
  8. default:  $nag="Brak strony!";  $ad="brak";
  9. }
  10. if(!isset($otwarcia))
  11. $otwarcia = 0; //jest to liczba otwarć stron z zabezpieczonej części serwisu, za pierwszym razem 
    trzeba się zalogować
  12. include("secur.php"); //tutaj jest rozwiązana weryfikacja - w przypadku braku autoryzacji reszta skryptu nie jest wykonywana, tak samo w pr
    zypadku logowania i wylogowania, patrz niżej
  13.  
  14. include("menu.html"); //ostateczne budowanie html'a do wyświetlenia
  15. if(!file_Exists("$ad.html"))
  16. $ad="brak";
  17. include("$ad.html");
  18. include("dol.html");
  19. ?>

  1. plik secur.php //zawiera kolejno części odpowiedzialne za logowanie, wylogowanie, stronę powitaln
    ą po logowaniu, błąd logowania
  2. <? 
  3. function sprawdz($login, $haslo) 
  4. {
  5. include("passwords.txt"); //plik z tablicą asocjacyjną $loginy: klucze to użytkownicy (login), wartości to hasła
  6. if(@$loginy["$login"]==$haslo)
  7. $weryf="OK";
  8. else
  9. $weryf="NOK";
  10. return $weryf; //weryf - weryfikacja
  11. }
  12.  
  13. if(empty($haslo)||empty($login)) //LOGOWANIE
  14. {
  15. $nag = "Weryfikacja użytkownika"; //nagłówek
  16. include("menu.html"); //budujemy stronę, bo już nie "wrócimy" do poprzedniego pliku restricted.php, na końcu jest exit
  17. echo "
  18. <tr><td> <!-- TREŚĆ -->
  19. Informacje na tej stronie przeznaczone są tylko dla Członków.<br>
  20. <b>Zaloguj się:</b><p>
  21. <table><tr><td align=\"right\">
  22. <form method=\"post\" action=\"restricted.php\"> //czyli "wracamy" do poprzedniego pliku
  23. <input type=\"hidden\" name=\"ad\" value=\"$ad\">  //przekazujemy adres do którego chciał trafić user
  24. Login: <input type=\"text\" name=\"login\"><br>
  25. Hasło: <input type=\"password\" name=\"haslo\"><br></td>
  26. <td>&nbsp;<input type=\"submit\" name=\"loguj\" value=\"Loguj!\">
  27. //po kliknięciu submit wczytywany jest raz jeszcze poprzedni plik, jednak tym raze
    m bogatszy o zmienne $login i $haslo
  28. </td></tr></table>
  29. </td></tr> <!-- Kon TREŚĆ -->";
  30. include("dol.html");
  31. }
  32.  
  33. else if(@$action=="logoff") //WYLOGOWANIE, tylko jeśli pojawi się zmienna $action uwalniana przyciskiem "wyloguj"
  34. {
  35.  
  36. $nag = "Wylogowano $login";
  37. include("menu.html");
  38.  
  39. echo "
  40. <tr><td> <!-- TREŚĆ -->
  41. &nbsp;<p><center>Zostałeś pomyślnie wylogowany.</center>
  42. </td></tr> <!-- Kon TREŚĆ -->";
  43. include("dol.html");
  44. }
  45.  
  46. else
  47. $weryf = sprawdz($login, $haslo); //jeśli hasło lub login nie były puste odpalana jest funkcja
  48.  
  49. if($weryf=="OK") //jeśli weryfikacja pomyślna
  50. {
  51. session_register ("login");
  52. session_register ("haslo");
  53. session_register ("weryf");
  54.  
  55. if($otwarcia==0) //jeśli dopiero co się zalogowaliśmy i mamy true pojawi się poniższe przywitanie
  56. {
  57. $st_nag = $nag; //aby zachować nagłówek (nazwę) strony do której chciał się dostać user, zmienna z adresem jest zachowana
  58. $nag = "Zalogowano pomyślnie!"; //nazwa aktualnej strony powitalnej
  59. include("menu.html");
  60. echo "
  61. <tr><td> <!-- TREŚĆ -->
  62. Witamy użytkownika <b>$login!</b><p>
  63. Możesz teraz korzystać z części serwisu przeznaczonej wyłącznie dla Członków.<p>
  64. Kliknij tu, aby dostać się do wybranego wcześniej zasobu - <a href=\"restricted.php?ad=$ad\">$st_nag</a>.
  65. </td></tr> <!-- Kon TREŚĆ -->";
  66. include("dol.html");
  67. $otwarcia++; //zmieniamy na 1
  68. session_register ("otwarcia");
  69. }
  70. session_register ("otwarcia"); //jeśli wszystko się powiodło po prostu zmienne są przekazywane i user trafia tam 
    gdzie chciał
  71. }
  72.  
  73. else //jeśli weryfikacja nie powiodła się
  74. {
  75. $nag = "Weryfikacja użytkownika";
  76. include("menu.html");
  77. echo "
  78. <tr><td> <!-- TREŚĆ -->
  79. <p>Błędny login lub hasło!<br>Spróbuj raz jeszcze.<p>
  80. <table><tr><td align=\"right\">
  81. <form method=\"post\" action=\"restricted.php\">
  82. <input type=\"hidden\" name=\"ad\" value=\"$ad\">
  83. Login: <input type=\"text\" name=\"login\"><br>
  84. Hasło: <input type=\"password\" name=\"haslo\"><br></td>
  85. <td>&nbsp;<input type=\"submit\" name=\"loguj\" value=\"Loguj!\">
  86. </td></tr></table>
  87. </td></tr> <!-- Kon TREŚĆ -->";
  88. include("dol.html");
  89. }
  90. ?>
Cezar708
KIlka dość poważnych uchybień:

1. restricted.php, linia 11
masz tam teraz if(!isset($otwarcia)), a nie wiadomo skąd wzięła się zmienna $otwarcia. Zapewne w ustawieniach PHP (plik php.ini) masz zmienną register_globals ustawioną na ON. Jest to bardzo zła praktyka i nie zalecana ze względów bezpieczeństwa. Dlaczego? Na tym forum wiele tematów pod hasłem "register_lobals" znajdziesz.

2. secur.php linia 6
include("passwords.txt"); - tu baardzo duża luka... co się stanie jeśli w przeglądarce wpiszesz: http://<domena>/passwords.txt? Założę się, że w tym przypadku na ekranie pojawią się wszystkie hasła Twoich użytkowników. Druga sprawa jest taka, że te hasła nie są zahaszowane (poczytaj trochę o md5 i sha1), więc nawet jeśli komuś udałoby się ukraść te hasła z pliku passwords.txt to i tak musiałby się trochę namęczyć aby te hasła odzyskać. Powtarzam jest to bardzo duża luka więc tu na pewno musisz ją poprawić

To tyle wstępem, jeszcze trochę musisz się pouczyć, ale popieram własną inicjatywę przy pisaniu kodu.

Pozdrawiam
swierszcz
Cytat(Cezar708 @ 21.01.2008, 09:39:24 ) *
1. restricted.php, linia 11
masz tam teraz if(!isset($otwarcia)), a nie wiadomo skąd wzięła się zmienna $otwarcia.

Ona powstaje właśnie w tym miejscu - jeśli nie istniała wcześniej - czyli przy pierwszej odsłonie tego pliku.
Co prawda napisałem, że decyduje ona o tym czy trzeba się zalogować, jednak nawet jeśli nie trzeba ($otwarcia >0) to funkcja sprawdz() i tak jest każdorazowo odpalana (secur.php, ln 50). Więc chyba nie da się tego wykorzystać jako luka w bezpieczeńst
wie.

Cytat(Cezar708 @ 21.01.2008, 09:39:24 ) *
2. secur.php linia 6
include("passwords.txt"); - tu baardzo duża luka... co się stanie jeśli w przeglądarce wpiszesz: http://<domena>/passwords.txt? Założę się, że w tym przypadku na ekranie pojawią się wszystkie hasła Twoich użytkowników.

Racja, ale... Skąd byś wiedział jak się nazywa ten plik? Powyższą nazwę można jeszcze zagadywać w ciemno, ale oczywiście nazwałem go inaczej (tu wpisałem tak z 2 powodów: aby kod był czytelniejszy oraz jakby ktoś wyniuchał gdzie ten kod jest wykorzystany :] ). Plik może być też umieszczony w podkatalogu. Z kolei gdyby ktoś mógł listować katalog na serwerze to nie musi szukać haseł tylko wejść wprost w pliki do których powyższe hasła dostępu bronią. smile.gif
BTW Da się przeskoczyć brak praw do listowania katalogu (na na założeniu, że nie, opiera się mój skrypt)?

pozdrawiam
Swierszcz

Szupien
Podaj mi adres strony gdzie takie coś wykorzystałeś a coś ci pokarze ;P (wyslij na pw)
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.