Proste czy trudne? Czyli bezpieczne logowanie if w PHP

Proste czy trudne? Czyli bezpieczne logowanie if w PHP
MA
  • Rejestracja:prawie 13 lat
  • Ostatnio:ponad 12 lat
  • Postów:9
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:

Kopiuj
<?
$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"?


Moja strona: materdefense.hostzi.com
Sarrus
  • Rejestracja:prawie 14 lat
  • Ostatnio:około 5 godzin
  • Postów:2512
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.

edytowany 1x, ostatnio: Sarrus
MA
  • Rejestracja:prawie 13 lat
  • Ostatnio:ponad 12 lat
  • Postów:9
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.


Moja strona: materdefense.hostzi.com
Sarrus
Najprostszy program odpytujący stronę mogę Ci napisać w 5 min. Ja nie widzę problemu w napisaniu własnego programu, już większy problem jest ze zdobyciem dobrego słownika :P. PS. mój post przedstawia sprawę w znacznym uproszczeniu.
ZJ
  • Rejestracja:prawie 14 lat
  • Ostatnio:prawie 12 lat
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".

RE
jak zahaszujesz coś kilkadziesiąt tysięcy razy to tylko stracisz na entropii
ZJ
Jak używasz soli to kolizja mało zmienia. Dodatkowo spowalniasz bruteforce wielokrotnie. Tak się to robi, a nie jak twórca pewnego forum "Hasła są bezpieczne, bo używam SHA-256 bez soli". Przeciwko atakom słownikowym to nie chroni, puścisz MD5 50000 razy z solą, hasła przeciwko takim atakom będą o wiele bezpieczniejsze.
byku_guzio
Zdecydowanie lepiej jeden raz sha-256 z solą + limit ilości błędnych logowań w czasie niż niepotrzebnie liczyć tyle razy hash
byku_guzio
  • Rejestracja:prawie 15 lat
  • Ostatnio:około 7 lat
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


edytowany 1x, ostatnio: byku_guzio
ZJ
Masz gdzieś jakieś źródło na to, że wielokrotne liczenie hashy jest złym pomysłem? Tak np. działa wiele odmian unixowego crypta do hashowania haseł użytkownika(kiedyś 25 razy szyfrowanie zera DESem, później min. kilkatysięcy razy md5, teraz zwykle albo bcrypt, albo wielokrotnie SHA2), czy w Password Safe (co najmniej 2048 razy SHA 256).
byku_guzio
nie chce mi się szukać źródła, ale zakładając, że dla dwóch różnych wejść może wyjść taki sam hash(kolizja) to z każdym kolejnym hash'owaniem zwiększa się szansa trafienia na kolizję. Wystarczy, że gdzieś po drodze w tych tysiącach hashowań trafi się ten sam hash.
ZJ
Nie znalazłem nigdzie nawet teoretycznej możliwości zastosowania takiego ataku. Z kolei bruteforce haseł jest atakiem bardzo popularnym, chyba innego ataku na hasła nie ma. Przed atakiem preimage (znaleźć m, takie że h(m) == x, czyli ten wykorzystywany przy hashowaniu haseł) z dużym nadmiarem chroni md5 (jest złamany dla kolizji, czyli znalezieniu m1 i m2 takie, że h(m1) == h(m2)). Hasła mają często bardzo małą entropię i ataki słownikowe je kładą. Dwukrotne zwiększenie ilości operacji daje Ci w praktyce jeden bit hasła więcej. Dodatkowo implementacja w crypt cdn.
ZJ
próbuje ewentualnemu spadkowi przeciwdziałać modyfikacji hasha przed koleinymi operacjami. Dużą zaletą crypta jest to, że jest domyślną funkcją php, szczególnie opcja z blowfish jest dobra, bo wymaga więcej pamięci. Przy stosowaniu iteracji prostych hashy (md5, sha2) trzeba wziąć pod uwagę to, że ty liczysz jeden hash na raz, a przeciwnik parę tysięcy. Z tego powodu używając bardziej pamięciożernych hashy (bcrypt i nowy scrypt) twój wydatek może być mniejszy dla osiągnięcia tego samego bezpieczeństwa.
MA
  • Rejestracja:prawie 13 lat
  • Ostatnio:ponad 12 lat
  • Postów:9
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


Moja strona: materdefense.hostzi.com
szopenfx
  • Rejestracja:ponad 20 lat
  • Ostatnio:4 miesiące
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.

unikalna_nazwa
  • Rejestracja:około 14 lat
  • Ostatnio:ponad 9 lat
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


Pół giga extra na dropboxie? Pół giga extra na dropboxie! Tyle wygrać! >>Klik here<<
edytowany 3x, ostatnio: unikalna_nazwa
ZJ
  • Rejestracja:prawie 14 lat
  • Ostatnio:prawie 12 lat
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

edytowany 2x, ostatnio: Zjarek
MA
  • Rejestracja:prawie 13 lat
  • Ostatnio:ponad 12 lat
  • Postów:9
0

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

Życzę miłego dnia wszystkim "specom"


Moja strona: materdefense.hostzi.com
szopenfx
  • Rejestracja:ponad 20 lat
  • Ostatnio:4 miesiące
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

MA
  • Rejestracja:prawie 13 lat
  • Ostatnio:ponad 12 lat
  • Postów:9
0
Kopiuj
 <?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


Moja strona: materdefense.hostzi.com
SI
  • Rejestracja:około 14 lat
  • Ostatnio:ponad 11 lat
0

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

szopenfx
  • Rejestracja:ponad 20 lat
  • Ostatnio:4 miesiące
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:

Kopiuj
<?
$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

edytowany 1x, ostatnio: flowCRANE
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)