Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [skrypt] bezpieczeństwo - ograniczony dostęp
swierszcz
post 21.01.2008, 01:52:56
Post #1





Grupa: Zarejestrowani
Postów: 4
Pomógł: 0
Dołączył: 20.01.2008

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


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. ?>
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 3)
Cezar708
post 21.01.2008, 09:39:24
Post #2





Grupa: Zarejestrowani
Postów: 1 116
Pomógł: 119
Dołączył: 10.05.2005
Skąd: Poznań

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


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

Ten post edytował Cezar708 21.01.2008, 09:40:19
Go to the top of the page
+Quote Post
swierszcz
post 21.01.2008, 14:24:30
Post #3





Grupa: Zarejestrowani
Postów: 4
Pomógł: 0
Dołączył: 20.01.2008

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


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

Go to the top of the page
+Quote Post
Szupien
post 24.01.2008, 16:30:59
Post #4





Grupa: Zarejestrowani
Postów: 78
Pomógł: 0
Dołączył: 24.11.2007

Ostrzeżenie: (30%)
XX---


Podaj mi adres strony gdzie takie coś wykorzystałeś a coś ci pokarze ;P (wyslij na pw)

Ten post edytował Szupien 24.01.2008, 16:31:24
Go to the top of the page
+Quote Post

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

 



RSS Wersja Lo-Fi Aktualny czas: 25.07.2025 - 01:07