[Bezpieczeństwo] Metody zabezpieczania serwisów internetowych
Witam.
Przedstawię Wam jedno z najprostszych i najbardziej skutecznych zabezpieczeń. Dla niektórych osób może się okazać równie absurdalne po przytoczeniu odpowiedniej analogii.
Otóż dzisiejsze firmy starają się jak najskuteczniej zabezpieczyć swoje strony internetowe, jednak tak czy inaczej padają one ofiarą ataków czego przykładem są ostatnie ataki Anonimowych oraz LulzSecurity.
Jednym z najczęstszych ataków na aplikacje webowe są SQL Injection oraz ataki typu "include". Obydwa równie niebezpieczne, z czego ten drugi jest nieco prostszy a jak się powiedzie to potrafi dać pełen dostęp do bazy danych aplikacji czy bazy danych całego serwera.
1. Interpreter, czy zawsze jest potrzebny?
Jednym z najprostszych sposobów na częściowe zabezpieczenie jest... przestań używać PHP/Javy/Pythona/Ruby/LUA/..., dosłownie.
Chodzi mi bardziej o to aby generować cache i wyświetlać więcej kodu HTML niż go generować na bieżąco. Unikanie uruchamiania parsera PHP, Pythona, Javy, Ruby, LUA czy innego wiąże się z mniejszym ryzykiem.
Drobniejsze podstrony WWW czasami lepiej wygenerować okresowo np. co 10 minut automatycznie z powłoki serwera niż serwować użytkownikowi odpowiedzi generowane całkowicie w czasie realnym bądź też przy pomocy cache po stronie parsera kodu.
Oczywiście metoda nie sprawdza się wszędzie, jednak warto ją wziąć pod uwagę kiedy piszemy system blogowy, portal czy cokolwiek innego nie potrzebującego większej interakcji z użytkownikiem.
2. Uniwersalne interfejsy
Zabezpieczanie aplikacji webowych do łatwych nie należy, osobiście uważam, że aby zabezpieczyć aplikację należy użyć czegoś cięższego co odbije się większym zapotrzebowaniem na zasoby.
Przykładem czegoś większego jest uniwersalny interfejs do bazy danych, niemalże odporny na ataki typu SQL Injection.
Przykład uniwersalnego interfejsu z projektu "OpenWikiBlog":
<?php $WhereClause = new tuxMyDB_WhereClause (); // poniższa linia wygląda na podatną na SQL Injection bądź inny atak, jednak tak nie jest bo klasa tworząca zapytanie potrafi na bieżąco filtrować argumenty i wartości przyjmowane z zewnątrz $WhereClause -> Add ('', 'name', '=', $_GET['seo_name'] ); // tworzenie zapytania $Query = $this->DB->Select( '*', 'libmypage', $WhereClause, '', '', 0,1); if ($Query -> num_rows == 1) { // hurra, zapytanie się powiodło, odnaleziono jeden rekord } ?>
Oprócz bezpieczeństwa przez swą uniwersalność interfejs zapewnia największą możliwą elastyczność przy tworzeniu aplikacji. Można dowolnie zmienić bazę danych przykładowo z MySQL na SQLite3 czy na jakąś tekstową bez żadnych zmian w kodzie aplikacji.