11. PROFESJONALNE ZABEZPIECZENIE HASŁEM Tworząc róŝne panele administratora jesteśmy naraŝeni na róŝne ataki osób ciekawskich. W tej lekcji dowiesz się, jak zakodować hasło i, jak obronić się przed potencjalnym atakiem. Dowiesz się takŝe jak udostępnić tą stronę sobie - administratorowi, a takŝe innym osobom znającym login pasujący do danego hasła - redaktorom. Kodowanie md5 Do kodowania znaków słuŝy funkcja md5, która wprowadzony tekst zakoduje uŝywając 256-bitowego ciągu znaków, tzn. wprowadzoną frazę zamieni na 32 znaki. Aby zobaczyć jak wygląda przykładowe hasło zakodowane algorytmem md5 wystarczy uŝyć prostego kodu: $tekst = md5("asdf"); echo "$tekst"; W wyniku powinniśmy ujrzeć 912ec803b2ce49e4a541068d495ab570. Uwaga: przy kodowaniu znaku wielkość liter ma znaczenie, oczywiście moŝna uŝywać takŝe cyfr i znaków specjalnych, a takŝe znaków polskich. Nawet maciupka zmiana w macierzystym, w naszym przypadku tekście powoduje ogromne zmiany w szyfrowaniu, dla przykładu fraza Asdf będzie widoczna w postaci a25fda70d4a94ee66872cf8194243a70. Uwaga: do kodowania uŝywane są wyłącznie cyfry i małe litery w róŝnych proporcjach. Prosty formularz logowania Najciekawsze jest to, Ŝe wcale nie musimy dekodować hasła, aby ujrzeć stronę. Wystarczy powyŝszy ciąg znaków przypisać np. instrukcji warunkowej, która będzie sprawdzać, czy tak samo są zakodowane dane z formularza. JeŜeli jakiemuś spryciarzowi udałoby się uzyskać dostęp do hasła (zakodowanego), to i tak, aby dostał się na określoną podstronę musi je dekodować (poniewaŝ skrypt, którego kod ujrzymy zakodowałby je ponownie i warunek nie byłby spełniony).
Oto przykład prostego kodu, wyświetlającego komunikat zgodny z wypełnieniem pola formularza (hasło: asdf): if (md5($_post[haslo]) == "912ec803b2ce49e4a541068d495ab570") else if ($_POST[haslo] == TRUE) Oczywiście moŝna dobezpieczyć to dodając miejsce na login, a takŝe rozszerzyć instrukcję, która pozwoli na wprowadzenie większej ilości haseł np. dla redaktorów i innych współpracowników. To zostawiam Twojej inwencji, a ja przechodzę do kolejnego tematu. Uwaga: warto polom formularza pozwalającym na przechowanie tekstu przypisać atrybut MAXLENGTH, którego wartość będzie oznaczać maksimum wprowadzonych znaków. Zmodyfikowany formularz Często wprowadzamy swoje loginy i/lub hasła wielkimi literami, zwykle przez przypadek np. włączony jest przycisk Caps Lock, lub niechcący nasz palec utknął na Shiftcie. Za pomocą funkcji strtolower() moŝemy wszystkie wielkie litery zamienić na małe, pozostawiając wszystkie inne znaki bez zmian. Oto przykład powyŝszego kodu z zastosowaniem tej oto funkcji:
$haslo = strtolower($_post[haslo]); if (md5($haslo) == "912ec803b2ce49e4a541068d495ab570") else if ($haslo == TRUE) W powyŝszym kodzie pojawiła się zmienna, której wartością jest przerobiona zminimalizowana wartość zmiennej o takiej samej nazwie wysłanej przez formularz. Teraz takie hasła: asdf ASDF asdf AsDf będą poprawne, oczywiście pomijając wielokropek :). Uwaga: moŝemy teŝ postąpić działalność odwrotnie, uŝywając funkcji strtoupper(), która zamieni wszystkie małe litery na wielkie, pozostawiając pozostałe znaki bez zmian. UwaŜam, Ŝe funkcja nie ma zbytnio ciekawego zastosowania w praktyce.
Uwaga: funkcje strtolower(), strtoupper() nie słuŝą bezpieczeństwu, tylko wygodzie osób znających hasło. Są sposoby, nie wiem jakie, ale zawsze jakieś są, Ŝe wpisując pewien ciąg do danego pola, moŝemy ujrzeć coś więcej niŝ przewidział administrator. Na początku poznajmy instrukcje warunkową, która dopuści do sprawdzania hasła, tylko wtedy, jeŝeli zmienna wysyłana przez formularz będzie składała się z wcześniej ustalonych znaków. Jest to tzw. funkcja ereg, której przypisujemy nie tylko konkretne znaki, ale całe ich przedziały. if (md5($_post[haslo]) == "912ec803b2ce49e4a541068d495ab570" && ereg("^[0-9a-za-z\._\-]+$",$_post[haslo])) else if ($_POST[haslo] == TRUE) Oprócz samego definiowania przedziałów znaków warto zabezpieczyć się przed tagami w haśle wykorzystanie ich w sprytny sposób moŝe pozbawić naszą wyłączność nad kontrolą nad skryptem, czy całą witryną. Funkcja strip_tags usunie: znaki < i > wszystkie znaki na prawo od <* wszystkie znaki na lewo od >*
Uwaga: pozycje z gwiazdką oznaczają, Ŝe zostaną usunięte wszystkie znaczki w określoną stronę, chyba, Ŝe wcześniej napotkają przeciwny tag.