stripchar - oczyszczanie danych wejściowych - zapytania sparametryzowane

Dlaczego Stripchar nie zablokował tego ataku wstrzyknięcia

Jeśli używasz odkleić Aby oczyścić dane wprowadzane przez użytkownika, nie jesteś sam. Wielu programistów polega na tego typu sanityzacja wejść Aby zablokować próby wstrzyknięcia. Na pierwszy rzut oka wydaje się to logiczne – usuń niebezpieczne znaki, a ładunek zniknie. Jednak takie podejście daje fałszywe poczucie bezpieczeństwa. W rzeczywistości atakujący mogą ominąć proste filtry, takie jak odkleić za pomocą zaciemnione ładunki, kodowania czy sprytne przełączanie kontekstu. Dlatego inteligentni programiści nie poprzestają na tym. Zamiast tego używają zapytania parametryczne, które zapobiegają atakom wstrzyknięć u korzenia.

W tym poście dowiesz się dlaczego odkleić Nie udaje się w rzeczywistych scenariuszach, jak atakujący nadużywają tych filtrów i jakie bezpieczne alternatywy faktycznie działają. Przeprowadzimy Cię przez przykłady kodu, pokażemy typowe techniki omijania i wyjaśnimy, jak sanityzacja wejść zawsze musi być połączony z zabezpieczeniami konstrukcyjnymi, takimi jak zapytania parametrycznelub pozostaniesz podatny na ataki.

Co odkleić Tak naprawdę działa (i nie działa)

Wielu programistów korzysta stripchar lub podobne funkcje do usuwania niebezpiecznych znaków z danych wprowadzanych przez użytkownika. Zazwyczaj usuwają one znaki interpunkcyjne, symbole specjalne i wszystko, co nie jest alfanumeryczne. Na pierwszy rzut oka brzmi to jak sanityzacja wejść, ale to nie jest prawdziwa ochrona.

Rozłóżmy to na czynniki pierwsze. Funkcja taka jak ta:

				
					function stripchar(input) {
  return input.replace(/[^\w\s]/gi, '');
}

				
			

usuwa znaki takie jak ', "lub ;. Tak więc, jeśli wpiszesz:

				
					'; DROP TABLE users; --

				
			

Staje się:

				
					DROP TABLE users

				
			

Nawet jeśli dane wprowadzane przez użytkownika wydają się poprawne, atakujący nadal mogą wstrzykiwać ładunki SQL, korzystając wyłącznie z logiki, szczególnie gdy aplikacja tworzy zapytania poprzez łączenie ciągów znaków. Aby naprawdę zapobiec atakom typu SQL injection, należy używać sparametryzowanych zapytań i przetwarzania danych wejściowych uwzględniającego kontekst. Filtry znaków, takie jak stripchar() po prostu nie wystarczą.

Oczywiście, na pierwszy rzut oka oczyszczone dane wejściowe mogą wydawać się bezpieczniejsze. Jednak takie podejście nie neutralizuje złośliwej logiki, a jedynie zmienia sposób jej zapisu. W rzeczywistości atakujący często wykorzystują to, kodując dane, wstawiając spacje lub strategicznie wykorzystując usunięte znaki, aby całkowicie ominąć filtr.

Oprócz, odkleić Brakuje krytycznego kontekstu. Nie wie, czy dane wejściowe są kierowane do bazy danych, powłoki czy przeglądarki. Oznacza to, że nie może zastosować odpowiedniego kodu ani metody ucieczki. Czyszczenie danych wejściowych bez znajomości celu jest jak usuwanie kodu HTML, gdy prawdziwe zagrożenie jest… SQLi.

Na końcu, odkleić  Nie interpretuje ani nie zabezpiecza niczego, po prostu edytuje ciągi znaków. A edycja to nie bezpieczeństwo. Jeśli chcesz prawdziwej ochrony, używaj ustrukturyzowanych, sprawdzonych i sparametryzowanych zapytań. Kropka.

Aby zobrazować różnicę, poniżej przedstawiamy porównanie stripchar z zapytaniami parametrycznymi:

Stripchar kontra zapytania parametryczne: które z nich naprawdę chronią Twój kod?

Cechastripchar()Sparametryzowane zapytania
Poziom ochronyPodstawowe czyszczenie ciągów znaków. Można to łatwo ominąć za pomocą kodowania lub sztuczek logicznych.Solidna ochrona przed wszystkimi formami ataków SQL injection.
Świadomość kontekstuNiewidoczny dla kontekstu (SQL, HTML, shell itp.). Wszędzie obowiązuje ta sama zasada.W pełni zależny od kontekstu. Używa odpowiednich znaków ucieczki dla każdego środowiska.
Wysiłek programistySzybkie do wdrożenia, ale zawodne przy długotrwałym stosowaniu.Wymaga prawidłowej integracji, ale także solidności i przyszłościowości.
Opór obejściaNiski — atakujący łatwo adaptują się, wykorzystując spacje, kodowanie lub logikę.Wysoki — oddziela kod od danych i skutecznie blokuje próby wstrzyknięcia.
Zaufanie do bezpieczeństwaFałszywe poczucie bezpieczeństwa — może ukrywać problem bez jego rozwiązania.Zaufany przemysł standard do bezpiecznego wykonywania zapytań.

Jak atakujący omijają sanityzację danych wejściowych

Tak wygląda typowy podatny na ataki przepływ, gdy programiści polegają na odkleić do dezynfekcji wejściowej:

stripchar - oczyszczanie danych wejściowych - zapytania sparametryzowane

Atakujący nie muszą łamać Twoich filtrów, wystarczy, że... obejdź ich dookoła. Kiedy programiści polegają na odkleić W przypadku oczyszczania danych wejściowych często zakładają, że usunięcie znaków takich jak cudzysłowy czy średniki zablokuje próby wstrzyknięcia. Jednak atakujący szybko się adaptują. Tworzą zaciemnione ładunki które prześlizgują się przez filtry oparte na wyrażeniach regularnych, szczególnie gdy filtrom tym brakuje kontekstu.

Załóżmy na przykład, że próbujesz oczyścić dane wejściowe w następujący sposób:

				
					const input = stripchar(userInput);
// safe to use? maybe not.
db.query("SELECT * FROM users WHERE name = '" + input + "'");

				
			

Nawet jeśli użytkownik nie może przesłać klasycznego ' OR 1=1 --Mogą używać sztuczek Unicode, łączenia ciągów znaków lub błędnej składni, która nadal działa. Ładunki takie jak ten często działają:

				
					0x27206F7220313D31--  
				
			

lub:

				
					'+UNION+SELECT+null,null,null--
				
			

Jeśli Twoja funkcja usuwa znaki niebędące słowami, możesz przypadkowo zrekonstruować prawidłowe polecenie SQLCo gorsza, atakujący mogą kodować wartości w sposób, który przejdzie przez filtr, ale zostanie zdekodowany przez system docelowy.

Oprócz wstrzykiwania kodu SQL, odkleić Nie działa również w innych kontekstach, takich jak polecenia powłoki, ścieżki plików, a nawet wykonywanie kodu JavaScript. Ponieważ nie wie, gdzie zostaną użyte dane wejściowe, nie może zastosować poprawnego escapingu ani walidacji.

W rezultacie sanityzacja wejść w odkleić łatwo obejść. Prawdziwe bezpieczeństwo pochodzi z sterowanie zależne od kontekstu, Zwłaszcza zapytania parametryczne które całkowicie zapobiegają wstrzykiwaniu logiki.

Dlaczego warto używać zapytań parametryzowanych

Jeśli naprawdę chcesz powstrzymać ataki wstrzykujące, musisz przestań budować zapytania z ciągami znaków. To tam gdzie zapytania parametryczne wejdź. W przeciwieństwie do odkleić, nie filtrują, one oddzielić kod od danych na poziomie silnika.

Przyjrzyjmy się ponownie uszkodzonemu zapytaniu:

				
					const input = stripchar(userInput);
const query = "SELECT * FROM users WHERE name = '" + input + "'";
				
			

Jest to niebezpieczne, ponieważ dane wejściowe są wstrzykiwane bezpośrednio do kodu SQL. Nawet z usuwaniem znaków, nadal tworzysz ciąg znaków, który może zostać niewłaściwie wykorzystany. Zamiast tego użyj sparametryzowanego zapytania, takiego jak to:

				
					const query = "SELECT * FROM users WHERE name = ?";
db.execute(query, [userInput]);
				
			

Tutaj sterownik bazy danych wie, że userInput to są dane, kod niewykonywalnyAutomatycznie unika tego zabezpieczenia i blokuje wstrzyknięcie, nawet jeśli dane wejściowe zawierają cudzysłowy, średniki lub dane zakodowane szesnastkowo.

W Pythonie:

				
					cursor.execute("SELECT * FROM users WHERE name = %s", (user_input,))
				
			

W PHP z PDO:

				
					$stmt = $pdo->prepare("SELECT * FROM users WHERE name = :name");
$stmt->execute(['name' => $input]);

				
			

We wszystkich tych przykładach, zapytania parametryczne zapobiec wstrzyknięciu bez konieczności zgadywania, które postacie mogą być niebezpieczne. Nie musisz stripchar, potrzebujesz strukturalnego, kontekstowego konstruowania zapytań.

Ponadto technika ta blokuje zaciemnione ładunki, sztuczki Unicode i obejścia kodowania, czyli te same unikatowe wzorce, które można znaleźć w Luki XSSNarzędzia takie jak Xygeni wykrywają te zagrożenia na wczesnym etapie SAST analiza.

Krótko mówiąc, prawdziwe mechanizmy obronne nie opierają się na filtrach. Opierają się na protokołach, zaufanych interfejsach API i pełnym kontekście. Jeśli korzystasz z frameworków lub dynamicznego wstrzykiwania usług, zwróć uwagę na to, jak dane wejściowe rozprzestrzeniają się w bazie kodu. Bezpieczne wstrzykiwanie zależności zapewnia, że ​​nawet skomplikowane przepływy nie otworzą nowych powierzchni ataku.

Nie polegaj na odkleić. Użyj Xygeni do egzekwowania prawdziwych obron

Nawet jeśli używasz zapytania parametrycznenie ma gwarancji, że cała Twoja baza kodu będzie zgodna z tą samą zasadą standardStarsza logika, skrypty firm trzecich lub pominięte linie w PR nadal mogą stwarzać ryzyko włamania. Właśnie tutaj Xygeni przychodzi z pomocą.

Xygeni skanuje Twój kod źródłowy, pull requestsi CI pipelines złapać:

  • Ciągi zapytań, które tworzą zapytania SQL za pomocą konkatenacji
  • Słabe lub domowe filtry, takie jak odkleić
  • Podejrzana logika, która pasuje do znanych, zaciemnionych ładunków

Nie musisz przeszukiwać każdej linii. Xygeni wcześnie sygnalizuje niebezpieczne wzorce i stosuje Samonaprawa gdzie to możliwe, i może blokować ryzykowne połączenia za pomocą konfigurowalnych Guardrails.

W skrócie, Xygeni dba o to, aby parametryzwane zapytania nie były tylko najlepszą praktyką, ale były również egzekwowane na dużą skalę. Koniec z domysłami. Koniec z pomijaniem filtrów. Tylko prawdziwa ochrona.

Chcesz zobaczyć, jak Xygeni znajduje niebezpieczne zapytania w Twoim kodzie?

Rozpocznij bezpłatny okres próbny! Bez karty kredytowej, pełen wgląd od pierwszego skanu.

Najważniejsze wnioski: O czym należy pamiętać odkleić i ryzyko wstrzyknięcia

  • odkleić nie jest funkcją bezpieczeństwa — usuwa znaki, a nie ryzyko.
  • Dezynfekcja danych wejściowych nie wystarczy podczas tworzenia zapytań z wykorzystaniem łączenia ciągów znaków.
  • Zapytania parametryczne to właściwa obronai obsługuje je każdy współczesny język lub framework.
  • Zaciemnione ładunki mogą ominąć filtry, zwłaszcza jeśli w grę wchodzą sztuczki kodowania.
  • Analiza statyczna (SAST) narzędzia wychwytują to, czego nie dostrzegają ludzie, w tym niebezpieczne wzorce ukryte w starszym kodzie.
  • Xygeni automatyzuje wykrywanie, ustalanie priorytetów, a nawet naprawę dzięki czemu Twój zespół może skupić się na tworzeniu funkcji, a nie na poszukiwaniu luk w zabezpieczeniach.

Wniosek: Nie ufaj filtrom. Bezpieczeństwo w fazie projektowania.

Poleganie na funkcjach takich jak odkleić Mogą wydawać się szybkim rozwiązaniem, ale dają fałszywe poczucie bezpieczeństwa. Atakujący ewoluują szybciej niż filtry ciągów znaków. Jedynym niezawodnym sposobem na powstrzymanie ataków typu injection jest napisanie bezpiecznego kodu i egzekwowanie go wszędzie.

Narzędzia takie jak Xygeni pomagają to zrobić automatycznie. pull request do pipeline, wychwytują to, czego nie wyłapią Twoje filtry i naprawiają zanim produkt dotrze do produkcji.

sca-tools-oprogramowanie-narzędzia-analizy-kompozycji
Określ priorytety, rozwiąż problemy i zabezpiecz zagrożenia związane z oprogramowaniem
Załóż darmowe konto.
Nie wymagamy karty kredytowej.

Zabezpiecz rozwój i dostarczanie oprogramowania

z pakietem produktów Xygeni