Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php] zabezpieczenie strony
Forum PHP.pl > Forum > PHP
marcinek37
witam,

1. zabezpieczyłem system wg wskazówek zawartych na stronach:
- http://php.pl/Wortal/Artykuly/Bezpieczenst...wa-skryptow-PHP
- http://webmade.org/porady/bezpieczenstwo-p...on-xss-csrf.php
oczywiście w internecie są setki podobnych artykułów, jednak nie wnoszą niczego nowego do dyskusji o bezpieczeństwie
czy informacje zawarte w nich są wystarczające? czy mam na coś innego zwrócić uwagę?

2. moje logowanie wygląda tak, że podaję login i hasło, system sprawdza, czy owy login jest w bazie, jeśli jest, to sprawdza, czy podane hasło po przejściu przez md5 jest zgodne z tym z bazy danych
jeśli jest powstają dwie sesje, w jednej podany jest numer ID użytkownika, a w drugiej znajduje się hasło po przejściu po funkcji md5

następnie po każdym odświeżeniu strony, system wie, że mam te dwie sesje, ale i tak je sprawdza, czy użytkownik o ID z sesji ma w bazie takie samo hasło jak te z sesji

czy to bezpieczne? czy może warto coś z tym zrobić?
nospor
1) Nie dwie sesje, a dwie wartości w jednej sesji.
2) Nie używaj md5 bo to już od dawna nie jest żadnym zabezpieczeniem
3) Nie widzę sensu za każdym razem sprawdzania danych sesji w tym co w bazie.
marcinek37
1. racja
2. załóżmy, że hasło administratora to QWERTYUIOP - i tak to hasło mam mieć zapisane w bazie danych? czy zakodowanie md5 nie daje już kompletnie nic? zatem jakich innych zabezpieczeń mam użyć?
3. to tylko dodatkowe zabezpieczenie, które raczej nie obciąża zbytnio serwera
nospor
ad2) Była o tym mowa wiele razy. Jest nawet przypiety temat:
http://forum.php.pl/index.php?showtopic=44...t=0&start=0

ad3) No tak, bez sensowne latanie po bazie za każdym razem dla 10 userow moze i nie jest mulaste, ale dla większej ilości...
Sephirus
Jak zwykle zgadzam się z przedmówcą smile.gif

Co do pkt. 2. polecam PHPass

Jeśli chodzi o pkt. 3. to samo sprawdzanie zalogowania powinieneś sprawdzać tylko po tym czy w sesji jest informacja o zalogowaniu usera. Innymi słowy jeśli masz zalogowanego gościa to przechowujesz w sesji pod kluczem na przykład "user_id" id zalogowanego użytkownika. Jeśli taki klucz istnieje - ktoś jest zalogowany (ten którego ID jest pod tym kluczem). Trzymanie id i hasła w sesji nie dość, że jest zbędne to zupełnie nie wnosi nic nowego. Jedyna ogólna opcja aby się dostać do czyjegoś konta to poznać ID sesji tego użytkownika i ustawić odpowiednie ciasteczko - przed tym powinieneś się bronić. Jak? Możesz na przykład w sesji, po zalogowaniu zapisać dane na temat IP, User-Agent gościa. Sprawdzając czy jest ktoś zalogowany wtedy sprawdzasz czy istnieje w sesji pole z ID zalogowanego użytkownika i jeśli tak to dodatkowo sprawdzasz czy w drugiej zmiennej sesyjnej, gdzie przechowujesz info o user-agent i/lub IP, są poprawne dla aktualnie sprawdzanego użytkownika dane.

Wydaje mi się, że tyle starczy na start smile.gif
marcinek37
2. możesz po krótce powiedzieć, jak działa PHPass?

3. czyli ktoś się loguje, ja sprawdzam czy dane się zgadzają, jeśli tak, wykonuję taki kod:
  1. <?
  2. $_SESSION['user_id'] = $r['id']; // wiadomo, powyżej powinno być zapytanie, nie podaję go, aby było szybciej
  3. $_SESSION['user_agent'] = $_SERVER['HTTP_USER_AGENT'];
  4. $_SESSION['user_ip'] = $_SERVER['REMOTE_ADDR'];
  5. ?>


i potem, aby sprawdzić, czy ktoś jest faktycznie zalogowany, dodać:
  1. <?
  2. if(isset($_SESSION['user_id']) && $_SESSION['user_agent'] == $_SERVER['HTTP_USER_AGENT'] && $_SESSION['user_ip'] == $_SERVER['REMOTE_ADDR']){
  3. echo'zalogowany';
  4. }
  5. else{
  6. echo'niezalogowany';
  7. }
  8. ?>

Sephirus
Ślicznie smile.gif

EDIT: Co do PHPass pobierz go po prostu - tam masz przykłady z tego co pamiętam, poczytaj i poszukaj na google o tym - jest trochę materiałów
marcinek37
sprawdzę to PHPass

2. załóżmy, że hasło administratora to QWERTYUIOP - i tak to hasło mam mieć zapisane w bazie danych? czy zakodowanie md5 nie daje już kompletnie nic? czy Wy też macie hasło w tak prosty sposób zapisane w bazie danych, czy po prostu ten problem rozwiązuje PHPass?
nospor
Cytat
2. załóżmy, że hasło administratora to QWERTYUIOP - i tak to hasło mam mieć zapisane w bazie danych? czy zakodowanie md5 nie daje już kompletnie nic? czy Wy też macie hasło w tak prosty sposób zapisane w bazie danych,
Przecież odpowiedziałem ci już na to pytanie w moim poprzednim poście. Po co je powielasz? Podałem ci nawet linka do dość pokaźnego tematu, który wyjaśnia kwestie hashowania.
marcinek37
przepraszam za problemy, nie zrozumiałem do końca

poza tym, czy mam zwracać na coś jeszcze uwagę? mowa o tych artykułach, czy są jeszcze jakieś błędy, które zdarzają się często programistom, a mogą doprowadzić do katastrofy?
erix
A przeczytałeś przyklejone wątki na forum? Wyszukiwarka nie gryzie. Tylko urywa ręce.
marcinek37
1. pobrałem sobie to: http://www.openwall.com/phpass/phpass-article-3.tar.gz
i skupiłem się na katalogu demo4, który najbardziej mi odpowiadał

przykładowy kod był spory, a jego konstrukcja mi nie odpowiadała, więc skróciłem go tak:
  1. <?
  2. <?php
  3. require '../PasswordHash.php';
  4. $hasher = new PasswordHash($hash_cost_log2, $hash_portable);
  5.  
  6. // oryginalne hasło
  7. $org_pass = 'XYZ';
  8.  
  9. // funkcja, która tworzy hash dla hasła
  10. $pass = $hasher->HashPassword($org_pass);
  11.  
  12. // hash, który się utworzył
  13. $org_hash = '$P$BxAextjApHS/s1Hj01Eydd9Jfv2PSb.';
  14.  
  15. // jeśli pokaże 1, to działa dobrze
  16. $ok = $hasher->CheckPassword($org_pass, $org_hash);
  17.  
  18. // wynik
  19. echo $ok;
  20. ?>


czy dobrze zrozumiałem jego działanie?

2. żeby kod nieco skrócić, zmieniłem nieco klasę:
  1. <?
  2. class PasswordHash {
  3. var $itoa64;
  4. var $iteration_count_log2 = 8;
  5. var $portable_hashes = FALSE;
  6. var $random_state;
  7. ...
  8. ?>

bo i tak nie wiem, do czego służą te parametry, więc wpisałem je na stałe

3. jak rozumiem, każda fraza może mieć kilka/kilkanaście swoich wersji, bo gdy odświeżałem stronę dla danej zmiennej, skrypt tworzył zupełnie inny hash

4. czy coś jeszcze powinienem wiedzieć o tym skrypcie?
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.