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"

0

"specu" nie powiedziałeś że masz upload plików - pokaż jego źródło tutaj.

0
Zjarek napisał(a):

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

Metody lamania sa w zasadzie trzy, a moze cztery. Moze zacznijmy od tego, czemu w ogóle hashe trzeba lamac. Uzyje gównianej analogii. Kazdy czlowiek czy tam pies czasami robi kupe. Przyjmijmy, ze jeden czlowiek zawsze robi taka sama kupe, ale kazdy czlowiek robi inna kupe. Kolor, zapach i ksztalt kupy nic nam nie mówi o czlowieku, który ja zrobil, nie mamy z niej zadnych informacji o tym czlowieku i znajdujac kupe na trawniku, nie wiemy kogo o nia oskarzyc. Jednak majac kilku podejrzanych, mozemy kazac im zrobic po jednej kupie i porównac te kupy z ta znaleziona na trawniku i wskazac winowajce. Podobnie jest w sytuacji, gdy ustalimy ze tylko wlasciciel kupy takiej jak ta trzymana w gablotce kolo drzwi, moze przejsc przez te drzwi. Wlasnie takiego mechanizmu dostarczaja hashe. Gdy zakladacie gdzies konto, wasza kupa (hash hasla) jest zapisywana w gablotce kolo drzwi, a przy kazdej próbie przejscia przez te drzwi nalezy podac haslo i wyliczyc jego hash (zrobic kupe). W praktyce taki hash jest po prostu dosc skomplikowana funkcja matematyczna, ale jak ktos to rozumie, to w wikipedii jest mu to lepiej wyjasnione. Ja na potrzeby poradnika wyjasniam jedynie, ze nie mozemy z hasha zrobic hasla (z kupy zrobic czlowieka), tylko sprawdzac jakie hashe daja rózne hasla (robic kolejne kupy) i patrzec, które pasuje. To daje nam trzy strategie.

:D

0
 <?php

if ($HTTP_POST_FILES["plik"]["tmp_name"] != '') {


print "<BR>Adres pliku: http://www.astrouniverse.netii.net/".$HTTP_POST_FILES["plik"]["name"];

print "<BR>Rozmiar pliku: ".$HTTP_POST_FILES["plik"]["size"]; }

?> 

Racja, racja, racja. Zapomiałem o filtrowaniu plików php i ich nadpisywaniu

0

Co jeśli strona z panelem administracyjnym zostanie przypadkiem zindeksowana przez Google?

0

Jeśli nigdzie nie poda linku do panelu administratora to roboty go nie zindeksują, oczywiście jeśli nie ma też takiej informacji w robots.txt
A autorowi proponował bym użycie gotowego "sprawdzonego" skryptu do uploadu plików - samemu napisanie takiego bezpiecznego skryptu to nie jest prosta sprawa (sam nie polecę niestety żadnego :P).

0

Ten kod jest podstawowy. Już lepiej zrobić formularz ( <form action="ten_plik.php" method="post"> ) ale i tak jeśli ktoś zobaczy plik skrypcik.js i na niego wejdzie od razu będzie miał panel administratora

Kod:

<?
$haslo = $_POST["haslo"];
if ($haslo == "kaczynski") {
echo "<script src=skrypcik.js></script>";
}
else
{
Wpisales nie poprawna nazwe uzytkownika! <a href="strona_z_formularzem.html">Logowanie</a>
}
??

dodanie znacznika <code class="php"> - @furious programming

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