Witam serdecznie,
Znalazłem w internecie ostatnio taki skrypt do bezpiecznego logowania: http://m.wikihow.com/Create-a-Secure-Login-Script-in-PHP-and-MySQL co o nim myślicie? W połączeniu z PDO wyglada chyba ciekawie? Znacie może jakieś ciekawsze rozwiązania?
Na pewno nie rozwiązuje to wszystkich możliwych problemów, pierwsze co mi przyszło do głowy: CSRF przy wylogowywaniu. Jest tylko notka:
Note: it might be a good idea to add CSRF protection here in case someone sends a link hidden in this page somehow. For more information about CSRF you could visit Coding Horror.
Czyli jakaś świadomość istnieje, chociaż tyle ;) Ale skoro już wiedzą to mogliby opisać.
Poza tym w kodzie jest błąd:
if ($insert_stmt = $mysqli->prepare("INSERT INTO members (username, email, password, salt) VALUES (?, ?, ?, ?)")) {
$insert_stmt->bind_param('ssss', $username, $email, $password, $random_salt);
// Execute the prepared query.
if (! $insert_stmt->execute()) {
header('Location: ../error.php?err=Registration failure: INSERT');
}
}
header('Location: ./register_success.php');
Niepowodzenie insertu i tak przekieruje pod register_success
, bo jedno Location
nadpisze drugie.
Nie ma nic wspomniane nt. niebezpieczeństwa związanego z podawaniem treści przy stosowaniu nagłówka Location
(co nie dziwi, skoro popełnili ten błąd).
Dwa pierwsze tematy jakie mi przyszły do głowy i jeden to po prostu lekka wada, a drugi to błąd. Odradzam korzystanie, choć znalezione błędy może nie są tragedią i raczej nie doprowadzą do wypływu informacji. Ale po prostu dalej nie weryfikuję tego kodu, więc może być coś gorszego.
A masz może jakieś sprawdzone, "gotowe" rozwiazanie które nie zawiera błędów? :) kurczę, to wydawało mi się dobre ;)
https://github.com/panique/php-login-advanced to jest lepsze?:)
Nie rozumiem, z czym problem, skrypt do bezpiecznego logowania?
A jaki skrypt jest niebezpieczny, tylko dziurawy czy bardziej dziurawy może być bezmyślny który jest po prostu wklejony z gotowca?
Żeby być w 100% pewnym trzeba postawić SSL by nie było możliwości sniffowania
Poza tym tworzysz sesje zamiast ciastka
session_start()
oczywiście sama sesja to nie jest 100% bezpieczeństwa najlepiej jest zrobić sesje w sesji i na Wyrażeniach warunkowych stworzyć kolizje której algorytm podparty będzie na kolizji zdarzeń.
Czyli np jak ktoś przechwyci sesje w jakiś sposób, np przez błąd XSS
to wywołanie kolizji w sesji sprawi że ma mniejsze prawdopodobieństwo na zalogowanie się. Co to znaczy
np skrypt będzie porównywał nie tylko ID sesji ale również wersje przeglądarki czy numer IP i wsadzasz jedną sesje w drugą. Nawet jak ktoś spreparuje nagłówek http , to mając inny ip który zapisał się do sesji nie przejdzie procesu logowania. Poza tym otagować funkcją sha256 parametry logowania jak i w bazie trzymać zaszyfrowane hasła, przełączyć opcje cookie set without httponly flag bo domyślnie jest bez flagi.
Dzięki temu nie będzie można odczytać zawartości ciastek. filtruj tagi w skrptach komentarzy i w każdym skrypcie output i zapisywanym do bazy funkcją html_Special_chars . Zawsze oczywiście to można obejść używając kodowania base 64 czy przepuscić do przez filtry parsera, ale byle laik script kiddes na pewno tego nie zrobi