Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Bezpieczenstwo kodu
Forum PHP.pl > Forum > Przedszkole
no_face
Witam Was.

Mam oto takie pytanie. Glownie chodzi mi o bezpieczenstwo.
Wymyslilem taki oto sposob uwierzytelniania i chcialbym sie dowiedziec czy jest bezpieczny i nie kryje w sobie jakis bonusow.

1. Dostaje z formularza nick i pass.
2. Wybieram z bazy haslo dla podanego w formularzu nicku i jeszcze raz nick (co jest raczej zbedne).
3. Sprawdzam czy podane dane z formularza pasuja do danych wyciagnietych z bazy.

Oto cala filozofia. Martwi mnie punkt 2. Czy jest to bezpieczne rozwiazanie, prosze o porade.
zombie
Chyba nie do końca rozumiem, ale zdecydowanie niebezpieczne (acz praktykowane co widać po przypominaczach haseł) jest przechowywanie w bazie niezahashowanego hasła. Hasło powinno być przynajmniej zahashowane przez md5" title="Zobacz w manualu php" target="_manual

ad.2 oczywiście, że jest zbędne, skoro nick jest już w zapytaniu
no_face
Co do hasel to oczywiscie ze sa zahaszowane sha1(); postawione sesje itd. Moze zadam pytanie inaczej. Czy sposob w jaki uwierzytelniam usera jest bezpieczny czy tez nie. Sam aspekt wybierania hasla (zahaszowane) z bazy dla nazwy nicka z formularza logowania i porownanie go z haslem podanym przez logujacego sie usera.

Czyli,
1. loguje sie user: jakis_user
2. podaje haslo
3. ja szukam podanego loginu w bazie
4. jezeli jest wyciagam pass dla tego loginu
5. porownuje haslo podane przy logowaniu z haslem wyciagnietym z bazy
6. itd

Czy ten sposob jest bezpieczny?

Moze troche kodu
  1. <?php
  2.  
  3. //polaczenie z baza itd
  4.  
  5. $user_f = $_POST['user_f']; // dane z formularza
  6. $pass_f = $_POST['pass_f']; // jw.
  7.  
  8. $sql = mysql_fetch_assoc(mysql_query("select * from jakas_tabelka where user = '$user_f'", $conn));
  9. $user = $sql['user']; // nie czepiac sie :)
  10. $pass = $sql['pass']; // wyciagam haslo dla podanego nicka z formularza
  11.  
  12. if (($user_f == $user) && (sha1($pass_f) == $pass)) // sprawdzenie itd.
  13. {
  14.  jest dostep
  15. }
  16. else
  17. {
  18.  brak dostepu dane sa nieprawidlowe
  19. }
  20.  
  21. ?>
zombie
wystarczy przecież:
  1. <?php
  2. $result = mysql_query("SELECT jakakolwiek_kolumna_tabeli FROM nazwa_tabeli WHERE pass='".sha1($_POST['pass_f'])."' AND user = '".$_POST['user_f']."'");
  3. if (mysql_num_rows($result) > 0){
  4. // autoryzacja
  5. } else {
  6. // nie ma bata!
  7. }
  8. ?>
... dlaczego ma być niebezpieczy? 100% pewności nie ma ... nawet w prezerwatywie winksmiley.jpg
number0
Cytat(zombie @ 2005-08-13 00:06:47)
if (mysql_num_rows($result) > 0){
// autoryzacja
} else {
// nie ma bata!
}

bład autoryzacja powinna nastąpić
tylko gdy zostanie zwrucony tylko 1 rekord

Poprawny kod
  1. <?php
  2.  
  3.  
  4. // filtrowanie danych
  5. $user_f = mysql_escape_string($user_f );
  6. $pass_f = mysql_escape_string($pass_f );
  7.  
  8. $sql = "SELECT COUNT(*) AS num_users
  9.  FROM " . USER_TABLE . "
  10.  WHERE
  11.  " . USER_TABLE_LOGIN . "='$user_f' AND
  12.  " . USER_TABLE_PASSW . "='$pass_f'";
  13.  
  14. $result = $this->db->query($sql);
  15. $row = $result->fetch();
  16.  
  17. if ($row['num_users'] != 1) {
  18. // brak autoryzacji
  19. } else {
  20. //autoryzacja
  21. }
  22. ?>
no_face
Przepraszam ze dopiero po tak dlugim okresie sie odzywam.
Co do autoryzacji to raczej zwroci tylko jeden rekord, a to z powodu tego ze przy rejestracji skrypt sprawdza czy istnieje dany user w bazie, dlatego tez zawsze zwroci tylko jeden rekord.

number0, jak narazie Twoj kod dla mnie nie jest jeszcze w calosci zrozomily.

pozdrawiam.
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.