Nie jestem ochroniarzem. Jestem programistą, który musi utrzymywać bezpieczny kod. To właśnie nazywam „kruchą” praktyką. Punkty wejścia są rozproszone po całym typowym projekcie. Znalezienie i odkażenie ich wszystkich to dużo pracy, aby rozwiązać tylko jeden problem, dużo starannej konserwacji i kłopotów, aby zapewnić, że pozostanie on skuteczny wraz ze zmianą kodu i pełen założeń, które czynią go nieskutecznym.
Zamiast tego stosuj praktyki, które są łatwiejsze w utrzymaniu, warstwowe, kontekstualne i rozwiązują szeroki zakres problemów. Wtedy nie potrzebujesz drogiego, zbyt szerokiego filtrowania.
Nie możesz zabezpieczyć danych wejściowych, jeśli nie wiesz, jak będą one używane.
Powiedzmy, że „zabezpieczył” system, usuwając wszystkie pojedyncze cudzysłowy ze wszystkich danych wejściowych. Świetnie, jesteś bezpieczny przed jednym typem ataku polegającego na iniekcji SQL. Co się stanie, jeśli to wejście zostanie użyte w ...
- Zapytanie MySQL, które pozwala na użycie podwójnych cudzysłowów
- Operacja systemu plików
- Polecenie powłoki
- Zapytanie sieciowe
- Nazwa metody
- Nazwa klasy
-
eval
Każda z mają one różne znaki specjalne, sekwencje ucieczki, zasady cytowania i praktyki bezpieczeństwa. Nie możesz przewidzieć, w jaki sposób twoje dane wejściowe zostaną użyte, gdy nadejdzie. Próba usunięcia wszystkich znaków specjalnych jest szaleństwem i „rozwiązuje” tylko jedną klasę ataku.
Albo co, jeśli użytkownik ma pozwolenie aby wprowadzić limit stron. Ten limit jest obowiązkowo używany w zapytaniach sparametryzowanych; bez iniekcji SQL, yay! Użytkownik wpisuje 9999999999
i teraz jesteś narażony na atak DOS.
Musisz zastosować odpowiednie środki bezpieczeństwa w miejscu, w którym wykonywana jest potencjalnie niebezpieczna operacja. Uwzględnia to wiele czynników specyficznych dla operacji; odkażanie znaków wejściowych to tylko jeden.
Dopóki to robisz, równie dobrze możesz sparametryzować swoje zapytania. Wtedy nie ma już potrzeby wykonywania całej pracy i niszczenia cytatów dotyczących usuwania koców.
Filtrowanie wszystkich danych wejściowych jest trudne.
Jest wiele, wiele, wiele sposobów pobierania i przekazywania danych wejściowych w danym projekcie:
- dane wejściowe
- urls
- nazwy plików
- zawartość pliku
- zapytania do bazy danych
- odczyty sieciowe
- zmienne środowiskowe
Zwykle są to dość wolne formy i mogą używać wielu różnych bibliotek. Nie znam żadnych narzędzi do analizy statycznej, które sprawdzają, czy wszystkie potencjalnie wrażliwe dane przeszły przez filtrowanie. Niektóre języki mają system taint
, ale ich efektywne użycie jest trudne. Nawet jeśli odfiltrujesz wszystkie dane wejściowe, bez narzędzia do analizy statycznej niefiltrowane dane wejściowe będą wyciekać z powrotem w miarę rozwoju. To dużo wysiłku w przypadku niekompletnego, kosztownego w utrzymaniu wyniku, który utrudnia funkcjonalność.
W przeciwieństwie do tego, zazwyczaj jest tylko jeden sposób wykonania SQL w projekcie. Istnieją narzędzia statyczne i wykonawcze, które automatycznie wykrywają potencjalne iniekcje SQL. Możesz nawet całkowicie zabronić ciągów i wymagać, aby wszystkie zapytania były obiektami zapytań SQL. Te dobre praktyki są łatwe w utrzymaniu i coraz częściej umieszczane w narzędziach i bibliotekach SQL.
„Zapory ogniowe” prowadzą do luźnych zabezpieczeń.
Podobnie jak w niektórych sieciach biurowych praktyki są bardzo niebezpieczne, ponieważ „ mamy firewall ”, istnieje ryzyko, że zespół będzie leniwy w kwestii zabezpieczania swojego kodu, ponieważ„ wejście jest bezpieczne ”. Dane wejściowe z całą pewnością nie są bezpieczne.
Ktoś mógłby powiedzieć „dlaczego nie oba?” Masz tylko tyle godzin na pracę nad projektem. Niska wydajność i wysoki poziom konserwacji są do dupy. Wdrożenie i utrzymanie go sprawi, że Twój ograniczony czas odejdzie od bardziej wydajnych i łatwiejszych w utrzymaniu praktyk. W najgorszym przypadku spędzisz tyle czasu, bawiąc się w walkę z danymi wejściowymi i późniejszymi problemami spowodowanymi przez zbyt agresywne filtrowanie, że nigdy nie będziesz miał czasu na odpowiednie środki bezpieczeństwa.
Krótko mówiąc, filtrowanie danych wejściowych jest drogie, nieszczelne, trudne w utrzymaniu, nie może rozwiązać problemu i może go pogorszyć.