Wykryto działanie AdBlocka!

Prawdopodobnie masz właczonego Adblocka. Korzystanie z bloga jest całkowicie darmowe. Jeśli jednak chcesz docenić prace autora, wyłacz blokowanie reklam dla tej witryny, aby jeszcze bardziej zmotywowac autora do dalszej pracy oraz częstszej publikacji artykułów.

Dziękuje :)

Treść główna bloga

Artykuły

Bezpieczeństwo stron internetowych – zabezpieczenia


Zabezpieczenia stron internetowych Tworząc jakąkolwiek witrynę w oparciu o PHP oraz MySQL lub inne bazy danych, powinniśmy zatroszczyć się o to, aby zminimalizować możliwość ataków na naszą stronę internetową. Hakerzy używają takich metod jak: SQL Injection czy też XSS (Cross Site Scripting). Dzięki funkcjom PHP możemy zabezpieczyć naszą stronę.

Na początku mały słownik:

SQL Injection – atak,który polega na „wstrzykiwaniu” wywołań SQL, za pomocą, np. niezabezpieczonych formularzy.

XSS – Cross Site Scripting, jest to jeden z najniebezpieczniejszych ataków na witryny internetowe. Polega on na „wstrzyknięciu” kody HTML lub JavaScript, poprzez formularze bez filtracji danych.

Jak się bronić?

W PHP mamy wiele przydatnych funkcji:

1. Zamiana znaczników HTML na encje.

3. Escape’owanie ciągu wejściowego, czyli dodawanie \.


4. Rzutowanie typu danej zmiennej / bindowanie.

Bardziej skutecznym sposobem jest bindowanie w zapytaniu SQL.

W funkcji bindValue mamy ssi, co oznacza, że dwie pierwsze zmienne są typu string a trzecia jest typu integer.

5. Nie pokazuj komunikatów z bazy danych o błędach.

Dzięki tej funkcji nie będą pokazywane jakiekolwiek błędy. Jeśli jakiś będzie miał miejsce należy poinformować użytkownika o tym.
Dla naszej wiadomości warto zastosować loggera.

6. Zamiast zdeprecjonowanego mysql_* używaj mysqli_* lub PDO.

Starsze wersje mogą mieć błędy, które zostały naprawione w jego kolejnych wersjach.

7. Ustaw maksymalną ilość prób logowania / wysłania formularza w danym czasie.
Z pomocą przyjdą tu cookie oraz baza danych. Jeśli ktoś zalogował się błędnie więcej niż, np 5 razy w bazie danych zmienia się status z unbanned na banned na określony czas.

8. Stosuj captcha, które jest trudne do odczytania dla robotów a możliwe dla ludzi.

9. Nie używaj zdeprecjonowanych funkcji.

10. Zmienne serwerowe – http_host i request_method.


11. Blokowanie dostępu do pliku – .htaccess

W pliku .htaccess:

12. Blokowanie dostępu do folderu – .htaccess
W pliku .htaccess

13. Używaj PHP w wersji większej niż 5.
Starsze wersje mogą mieć błędy, które zostały naprawione w wersji 5 lub większej.

14. Wyłącz register_globals jeśli to możliwe.

15. Nie używaj eval()

Z pewnością są jeszcze inne sposoby zabezpieczenia naszych stron przed atakami hackerów. Ja jednak podałem kilka sposobów jak chronić naszą witrynę przed atakami.

  • 8. Stosuj captcha, które jest trudne do odczytania dla robotów a możliwe dla ludzi.

    dlaczego mam udowadniac, ze jestem czlowiekiem?

    • Ponieważ są roboty, które mogą wysyłać niechciany spam w komentarzach lub próbować uzyskać dostęp, np. do twojego konta. Zakładając, że ktoś zaloguje się niepoprawnie 3 razy można poprosić go o przepisanie captch’y

      • Ponieważ są roboty, które mogą wysyłać niechciany spam w komentarzach

        To wciąż nie mój problem, a Twój – webmastera

        Zakładając, że ktoś zaloguje się niepoprawnie 3 razy można poprosić go o przepisanie captch’y.

        To bardziej moja sprawa. Jeśli wpisze przykładowo 5x swoje hasło złe to powinno pobrać moje ustawienie odnośnie zabezpieczania kont i następne logowanie powinno być możliwe np po odblokowaniu konta poprzez klikniecie na link, który jest na poczcie ;d

        Na każda catpche jest jakieś logiczne wyjście ;p

        • Odwiedzanie strony z linka w mailu też nie jest skutecznym zabezpieczeniem. Wystarczy np. dopisać moda do XR, aby to obsługiwał.

  • Hej,

    odnośnie pierwszych dwóch punktów, to IMHO problem problem polega na tym, że aplikacje w PHP często mają logikę wymieszaną z wyświetlaniem strony.

    IMHO powinno być tak, że kod w PHP generuje zawartość strony (jako jakaś lista zmiennych, słownik, czy coś), a potem przekazuje ją do szablonu (który domyślnie maskuje wszystkie znaki HTML’owe) i uzupełnia szablon o dane z tej listy, dzięki temu nie trzeba się martwić o ich ręczne maskowanie.

    Tak chyba działają Smarty no i Django w Pythonie też ma takie coś.

    Co do punktu trzeciego, to IMHO powinno się używać jakiegoś ORM’a (np. takiego jak w Django, który w sumie jest na tyle elastyczny, że można by go chyba nazwać takim osobnym DSL’em (domain specific language)). Dzięki temu odpada konieczność dziergania ręcznie zapytań do bazy danych oraz maskowania różnych znaków.

    Co do punktu dziewiątego, to IMHO nie ma to aż tak dużego znaczenia, jeśli ktoś wykradnie nam bazę danych to to już jest taka wielka wpadka, że inne schodzą na dalszy plan :))

    Robert

    • Witaj Robercie,

      odnośnie pierwszych dwóch punktów, to IMHO problem problem polega na tym, że aplikacje w PHP często mają logikę wymieszaną z wyświetlaniem strony.

      Masz racje, ja jednak tworzę osobne metody, które odpowiedzialne są za konkretne funkcje filtrujące w innych metodach takich jak proces rejestracji lub logowania.

      IMHO powinno być tak, że kod w PHP generuje zawartość strony (jako jakaś lista zmiennych[…]

      Na Pythonie się niestety nie znam lecz mogę powiedzieć, że smarty idealnie nadaje się do oddzielenia logiki aplikacji od jej warstwy prezentacyjnej.

      Co do punktu trzeciego, to IMHO powinno się używać jakiegoś ORM’a (np. takiego jak w Django, który w[…]

      Teoretycznie masz racje, jednak w przypadku niewielkich aplikacji myślę, że wystarczy osobna klasa do obsługi bazy danych. IMO ORM w takich przypadku to przerost formy nad treścią.

      Co do punktu dziewiątego, to IMHO nie ma to aż tak dużego znaczenia, jeśli ktoś wykradnie nam bazę danych to to już jest taka wielka wpadka, że inne schodzą na dalszy plan 🙂 )

      Niby tak ale dodatkowe zabezpieczenie nigdy nie zaszkodzi. Przezorny zawsze ubezpieczony.

      Pozdrawiam,
      Dominik

  • Bardzo dobry artykuł, best practices w bardzo dobrym wydaniu, choć zaproponowane działania nie wyczerpują tematu bezpieczeństwa stron, aplikacji internetowych, polecam wykonanie audytu w technologii BlackBox który zweryfikuje wszystkie słabości i możliwe wektory ataków strony internetowej – polecam http://www.netaudit.com.pl

  • Captcha jest już coraz mniej przydatna, najsprytniejsze roboty potrafią odblokować to zabezpieczenie.

    • Wiem że komentarz pisany dwa lata temu, ale są teraz bardziej zaawansowane mechanizmy capatche odporne na programy OCR (dźwiękowe, logiczne zagadki, puzzle a nawet wideo)…

  • Zabezpieczeń nigdy za wiele.
    Pragnę zauważyć że jeśli chodzi o wykorzystywanie MySQL to bibioteka PDO wypiera powoli tradycyjne funkcje mysql_query() itp. Jeśli ktoś chciałby jakieś porady zapraszam 🙂 Budowanie i Pozycjonowanie stron www Pozdrawiam.

  • Piotrek

    Kopie plików są też bardzo ważny. Ostatnio znalazłem bardzo ciekawy portal pozwalający na wykonywanie backup stron internetowych. Jest to fajne narzędzie w pełni automatyzujące proces.
    Mi ostatnio uratowało w życie gdy okazało się, że jeden z pluginów w WordPress ma dziurę 🙂

  • Madzia Ciechanowska

    Bezpieczeństwo strony internetowej jest mega ważne, z doświadczenia wiem ile luk można znaleźć na wielu stronach i jak hakerzy potrafią je wykorzystać. Strzeżmy się 😛 Tymczasem polecam dobrą lekturę na temat bezpieczeństwa stron internetowych: http://brandpro.pl/bezpieczenstwo_twojej_strony_internetowej