Proste czy trudne? Czyli bezpieczne logowanie if w PHP

0

Ciekawi mnie jedna rzecz. Mam np: Panel Administratora i chciałbym zrobić do niego logowanie. Wiele robi cuda, ale ja pomyślałem jakby zrobić najprościej:

<?
$haslo = $_POST["haslo"];
if ($haslo == "kaczynski") {
echo("<script src=skrypcik.js></script>");
}
else
{
}
?? 

I jakiś tam formularz. A skrypcik.js to przekierowanie do pliku w którym jest panel administratora.
Według mnie taki skrypt jest 101% bezpieczny bo nie ma tu ani żadnej bazy danych, ani żadnego pliku tylko zwykły warunek if. Oczywiście nie da się dostać do kodu PHP strony, więc hasło jest nie do zdobycia. Co o tym myślicie? Czy zwykły najprostszy if potrafi być bezpieczniejszy od innych "cudów"?

0

Założenie, że nie da się dostać do kodu w php jest błędne i tak samo błędne jest to, że hasło jest nie do zdobycia. Zależy przede wszystkim gdzie strona stoi i na jakim serwerze. W najlepszym razie jest to bardzo utrudnione. Poza tym posiadanie jednego tylko hasła nie jest zbyt bezpieczne, bo z użyciem ataku słownikowego można je złamać w przeciągu dnia.

0

Atakiem słownikowym? No jak hasło jest "kaczyński" to tak, ale jak hasło będzie "dzis123kaczynski234nas345odwiedzi" to będzie wtedy nie możliwy atak słownikowy. Do tego atak słownikowy stosujemy do logowania, a tu jest zwykłe sprawdzanie tekstu, wiec ktoś musiał by napisać własny program, aby to złamać np: jeśli strona zmieni wygląd po słowie lub wystąpi jakiś skrypt - pokaż to słowo.

0

Ogólnie to hasło powinieneś porządnie je zahashować (bcrypt/scrypt, lub ewentualnie kilkadziesiąty tysięcy razy SHA-256), potem sprawdzać. Dodatkowo taki sposób sprawdzania hasła jest narażony na ataki oparte na czasie sprawdzania, choć to by wymagało bardzo dobrego połączanie z serwerem. Ogólnie to świetne informację w krótkiej formie są na https://www.owasp.org/index.php , na szybko to szukaj "cheat sheet".

0
Zjarek napisał(a):

Ogólnie to hasło powinieneś porządnie je zahashować (bcrypt/scrypt, lub ewentualnie kilkadziesiąty tysięcy razy SHA-256), potem sprawdzać.

kilkadziesiąt tysięcy razy SHA-256 to jest ogólnie bardzo zły pomysł. Z każdym kolejnym liczeniem hash'a zmniejszasz entropię i łatwiej o kolizję

//zostałem wyprzedzony :p

0

Tylko tak się pytałem o te if-y bo nie chodzi mi o żadnych profesjonalnych hakerów tylko trolli i dzieci neostrady, które mogły by coś psuć na mojej stronce

0

skrypt jest na tyle bezpieczny na ile jest niedostępny plik skrypcik.js lub niezabezpieczona lokalizacja panelu bo znając jego nazwę nie będę potrzebował sprawdzania nawet najbardziej wymyślnego hasła.
w tym skrypcie pewnie wpadłeś na pomysł żeby zrobić przekierowanie do adres_strony/admin/ i sytuacja się powtarza. Jeśli masz gdzieś ukryty link do "tajnego" pliku roboty wyszukiwarek mogą go zindeksować i bez większego wysiłku wejdę przez googla :).
Ponadto zależnie od serwera np. apache domyślnie pokazuje zawartość folderu jeśli nie ma tam pliku domyślnego np. index.html.
Do tego kolejny problem... Jeśli zalogujesz się u mnie na kompie pójdziesz do domu to przez historię wejdę w twój zabezpieczony folder lub wystarczy że zajrzę przez ramię i sprawdzę URL gdy jesteś zalogowany.
Podsumowując kiepskie zabezpieczenie, ale jest to jeden ze szczebelków utrudniających zlokalizowanie panelu admina.

co do "kilkadziesiąty tysięcy razy SHA-256" jak już było napisane nie koniecznie musi pomóc a 30 sec. timeout nie pozwoli na zahashowanie takiej ilości ciągów chyba że stawiasz serwer na jakimś superkomputerze.

0

to czy jest bezpieczny też zależy od hostingu
kiedyś miałem konto na hostingu który umożliwiał podglądanie listy plików innych użytkowników (więc twoje "zabezpieczenie" by odpadło jako że opiera się tylko na znajomości nazwy pliku) a nawet umożliwiał podgląd zawartości przy odpowiednich chmodach (więc równie dobrze dało się tam podejrzeć hasło do bazy danych ;) )

co do zabezpieczenia to w ten sposób można nawet pominąć skrypt w .php i operować tylko po stronie klienta nie zapisując nigdzie hasła w postaci jawnej
wystarczy że nazwa pliku będzie generowana z hasła - na przykład hashując hasło i możesz to robić po stronie klienta w javascript'cie, a potem przez ajax sprawdzić czy taki plik istnieje i jeśli tak to zrobić przekierowanie a jeśli nie to wyświetlić informację o błędnym haśle

0

Jednokrotny SHA-256 nie nadaje się do dobrego kodowania haseł, szczególnie bez soli. Jest zbyt narażony na bruteforce, na GPU czas hashowania jest porażający. Oczywiście ilość kodowań, czy opcje bcrypta/scrypta trzeba dostosować, żeby nie dawać za dużego opóźnienia, ale im dłużej będzie zajmowało kodowanie haseł, tym bruteforce będzie trudniejszy. Nawet jeżeli (eksperyment myślowy, gdyby tak było, to pewnie SHA-256 byłby uznawany za zepsuty) takie wielokrotne hashowanie by zmniejszyło entropie bitów dwukrotnie (do 128), to ilu użytkowników używa hasła o takiej entropii. Szukanie kolizji w tym wypadku i tak jest zdecydowanie trudniejsze niż ataki słownikowe. Ludzie używają prostych haseł i powtarzają je na różnych stronach, nie powinno się atakującemu udostępniać haseł użytkowników praktycznie na tacy.

Funkcje hashujące są zaprojektowane do np. weryfikowania plików. Mają być szybkie i odporne na kolizje. Hashowanie haseł powinno być jak najwolniejsze (dopóki jest to użyteczne). Przykładowo do kodowania haseł w PHP powinno się używać http://www.php.net/manual/en/function.crypt.php (oczywiście nie z DESem).

Edit: Tutaj trochę więcej informacji o kodowaniu haseł http://tools.ietf.org/html/rfc2898 . Ten dokument jest sprzed 12 lat, więc trzeba wziąć pod uwagę zmianę szybkości obliczeń i używane algorytmy (np. MD5).

Edit2: A tutaj mały poradnik jak łamać hasła (znaleziony na Freenecie, odpowiednio skrócony żeby nie dawał za dużo informacji script kiddies). http://pastebin.com/VAbB2PiQ

0

No to zrobiłem logowanie if-em no i:
http://www.astrouniverse.netii.net

Życzę miłego dnia wszystkim "specom"

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0