sql substring_index - substring_index w sql - funkcje łańcuchowe w sql

Ukryte pułapki bezpieczeństwa SQL SUBSTRING_INDEX

Jedna funkcja, szeroka powierzchnia ataku

Wyobraź sobie: tworzysz mikrousługę, która przetwarza rejestracje użytkowników. Gdzieś w procesie pracy przycinasz adres e-mail za pomocą substring_index w SQL aby uzyskać domenę. Jest to proste, krótkie i dobrze sprawdza się w środowisku testowym. Następnie, w trakcie produkcji, logi zaczynają się zapełniać pełnymi nazwami i domenami e-mail w postaci zwykłego tekstu — to przypadkowy wyciek z pozornie niegroźnie wyglądającego wywołania SQL.

W tym tkwi problem: Indeks podciągu SQL to jedna z tych funkcji łańcuchowych w SQL, która wydaje się bezpieczna, dopóki nie zostanie użyta w niewłaściwym miejscu. W aplikacjach SaaS lub systemach wielodostępnych, które przetwarzają poufne dane, niewłaściwe użycie może ujawnić prywatne rekordy, a nawet umożliwić eskalację uprawnień bez wywoływania oczywistych alertów. W środowiskach krytycznych, zwłaszcza na platformach wielodostępnych, gdzie pojedyncze zapytanie może obsługiwać wielu klientów, niewielki błąd logiczny w ograniczniku… substring_index w SQL może prowadzić do ujawnienia danych między dzierżawcami i wycieku informacji pomiędzy odizolowanymi zestawami danych.

Zrozumienie SUBSTRING_INDEX w prawdziwym kodzie

W MySQL i MariaDB funkcja SQL substring_index przyjmuje trzy argumenty: ciąg do przetworzenia, separator i liczbę. Zwraca część ciągu przed lub po separatorze.

Jest powszechnie używany w zapytaniach aplikacji do szybkiego dzielenia wartości strukturalnych przechowywanych w jednym polu, na przykład do podziału wiadomości e-mail na nazwę użytkownika i domenę, wyodrębniania subdomeny z adresu URL lub izolowania prefiksu z klucza złożonego. Programiści często wybierają substring_index w SQL zamiast analizy składniowej po stronie aplikacji, ponieważ jest to…cise, pozwala uniknąć dodatkowego przetwarzania poza bazą danych i można go używać bezpośrednio w filtrach, połączeniach i operacjach grupowania.

Przykład: Wyodrębnianie nazwy użytkownika i domeny z wiadomości e-mail

				
					sql
SELECT 
    SUBSTRING_INDEX(email, '@', 1) AS username,
    SUBSTRING_INDEX(email, '@', -1) AS domain
				
			

OD użytkowników;

Typowe przypadki użycia substring_index w SQL obejmują:

  • Wyodrębnianie nazw użytkowników dla wiadomości powitalnych
  • Weryfikacja domen e-mail na podstawie list dozwolonych/zabronionych
  • Grupowanie użytkowników według domeny w zapytaniach analitycznych

Bo Indeks podciągu SQL jest oszustwemcisProgramiści często używają go bezpośrednio w funkcjach tekstowych SQL do filtrowania, walidacji lub raportowania. Problem zaczyna się, gdy ograniczniki lub liczniki są dynamiczne i pochodzą z danych wprowadzanych przez użytkownika.

Gdzie bezpieczeństwo jest zagrożone – Substring_index w SQL

Trzy główne wzorce ryzyka substring_index w SQL w odpowiedzialność, zwłaszcza w systemach wielodostępnych lub o wysokich stawkach:

Nadmierne ujawnianie danych

W przypadku współdzielonej bazy danych pojedynczy błąd niezgodności lub błędna liczba ograniczników może spowodować wyciek poufnych danych od innych użytkowników lub niepowiązanych z nimi osób.

				
					sql
-- Intended: first name only
SELECT SUBSTRING_INDEX(full_name, ' ', 1);
-- Bug: leaks full name and extra fields
SELECT SUBSTRING_INDEX(full_name, ' ', 3);

				
			

W systemie CRM obsługującym wielu najemców funkcja ta może ujawnić pełne nazwy klientów z innych firm w wyeksportowanym pliku CSV najemcy.

Dane wejściowe puste lub nieprawidłowe

Jeżeli brakuje ogranicznika lub dane wejściowe są nullem, Indeks podciągu SQL może zwrócić całe pole. W systemach o znaczeniu krytycznym może to ujawnić wewnętrzne identyfikatory, połączone metadane lub wartości debugowania nieprzeznaczone do widoczności zewnętrznej.

Nieautoryzowany dostęp w połączeniach lub podzapytaniach

W przypadku konfiguracji wielodostępnych nieostrożne korzystanie z funkcji łańcuchowych w SQL do określania zakresu dostępności dzierżawcy może spowodować przerwanie izolacji:

				
					SELECT o.id, o.amount, t.name
FROM orders o
JOIN tenants t
  ON SUBSTRING_INDEX(o.customer_ref, '-', 1) = t.tenant_code;

				
			

If customer_ref Jeśli dane są niespójnie sformatowane lub kontrolowane przez użytkownika, najemca A mógłby pobrać zamówienia najemcy B. W systemach płatności lub na platformach opieki zdrowotnej stanowi to bezpośrednie naruszenie zasad segregacji danych.

Przykład ryzyka wielodostępnego: Wyobraź sobie platformę do fakturowania SaaS, gdzie customer_ref koduje identyfikator dzierżawcy przed myślnikiem (NAJEMCA-ORDERID). Jeśli złośliwy użytkownik prześle numer zamówienia z identyfikatorem innego dzierżawcy, ale prawidłowym numerem zamówienia, a dołączenie zostanie wykorzystane substring_index w SQL bez weryfikacji mogli uzyskać dostęp do danych fakturowych należących do zupełnie innej organizacji.

Rzeczywiste wektory ataku w CI/CD i kod Open Source

Niewłaściwe użycie Indeks podciągu SQL nie jest tylko błędem początkującego programisty; pojawia się on w:

  • Zapytania ORM z dynamicznymi ogranicznikami
  • Procedury składowane w wtyczkach typu open source
  • Inline SQL, który łączy parametry żądania bezpośrednio

W jaki sposób niebezpieczny kod trafia do produkcji:

				
					Developer writes query using substring_index in sql  
    ↓  
Code is committed and pushed to the repository  
    ↓  
Automated build runs (no SQL security checks)  
    ↓  
Code review focuses on business logic, not string functions in SQL  
    ↓  
Changes are merged into the main branch  
    ↓  
Application is deployed to production  

				
			

Bez zautomatyzowanych kontroli niebezpiecznych funkcji ciągów znaków w języku SQL, zagrożenia te mogą przejść niezauważone przez proces weryfikacji i przedostać się do środowiska produkcyjnego, co może skutkować wyciekiem poufnych danych już od pierwszego dnia.

Wykrywanie w SAST/CI-CD

Najbezpieczniejszy sposób radzenia sobie z ryzykownymi sytuacjami substring_index w SQL wzorców jest ich blokowanie przed scaleniem.

Reguły wykrywania powinny wychwytywać:

  • w korzystaniu Indeks podciągu SQL z ogranicznikami lub liczbami z parametrów żądania
  • Brak walidacji ogranicznika

Przykładowa reguła minimalna:

				
					yaml
rules:
  - id: mysql-substring-index-dynamic-delimiter
    languages: [sql]
    message: Avoid SUBSTRING_INDEX with dynamic delimiter or count.
    severity: error

				
			

Pipeline krok:

				
					yaml

- name: SAST – SQL rules
  run: semgrep --config semgrep-sql.yml --error

				
			

Skanując niebezpieczne funkcje łańcuchowe w języku SQL podczas kontroli żądań ściągnięcia, eliminujesz konieczność zgadywania podczas przeglądu kodu.

Strategie łagodzenia skutków dla deweloperów

Wykrywanie ryzykownego użycia Indeks podciągu SQL W recenzjach lub skanach jest dobrze, ale prawdziwym sukcesem jest to, że w ogóle go nie wprowadzono. Wiele incydentów bezpieczeństwa ma miejsce, ponieważ programiści polegają na znanych skrótach, nie biorąc pod uwagę skrajnych przypadków.

Oto jak zapobiegać problemom podczas pracy z substring_index w SQL lub podobnych funkcji łańcuchowych w SQL:

Sprawdź położenie ograniczników przed wykonaniem
Nie zakładaj, że ogranicznik istnieje i znajduje się we właściwym miejscu. W systemach wielodostępnych pojedynczy, nieoczekiwany ogranicznik w identyfikatorze może otworzyć dostęp do danych innego użytkownika.

				
					sql

SELECT 
    CASE 
        WHEN LOCATE('@', email) > 0 
        THEN SUBSTRING_INDEX(email, '@', 1) 
        ELSE NULL 
    END AS username
FROM users;

				
			
  1. Sprawdź oczekiwaną długość wyjścia
    Ustaw bezpieczne granice. Jeśli wynikowy podciąg jest za krótki lub za długi, traktuj go jako nieprawidłowy.
  2. Przed użyciem oczyść i zakoduj dane
    Usuń nieuczciwe ograniczniki z danych wejściowych dostarczanych przez użytkownika, zanim dotrą one do kodu SQL
  3. Uniknąć substring_index w SQL w logice krytycznej dla bezpieczeństwa
    Nigdy nie używaj go do sprawdzania uprawnień, izolacji dzierżawcy ani do niczego, co kontroluje dostęp do poufnych danych. Analiza składniowa nie stanowi granicy bezpieczeństwa.
  4. Przenieś parsowanie do warstwy aplikacji. Logika po stronie aplikacji zapewnia lepszą kontrolę nad walidacją, obsługą błędów i testami jednostkowymi.
				
					python

def safe_split_email(email):
    if '@' not in email:
        raise ValueError("Invalid email")
    username, domain = email.split('@', 1)
    if '.' not in domain:
        raise ValueError("Invalid domain")
    return username, domain

				
			

Traktując funkcje łańcuchowe w SQL jako niezaufane ścieżki kodu, zmniejszasz promień rażenia wszelkich błędów logicznych.

Integracja z narzędziami bezpieczeństwa 

Nawet zespoły z dużym doświadczeniem nie mogą polegać wyłącznie na ręcznych przeglądach; ryzykowne wzorce, takie jak brak bezpieczeństwa Indeks podciągu SQL wykorzystanie może umknąć uwadze, zwłaszcza w przypadku dużych baz kodu lub w przypadku kodu pochodzącego od osób trzecich.

Dlaczego warto integrować narzędzia takie jak Xygeni:

  • Obejmuje zarówno kod open-source, jak i zastrzeżony:zapewnienie, że luki w zabezpieczeniach nie są ukryte w pakietach dostawców lub starszych modułach.
  • Wykrywa niebezpieczne wzorce w skryptach SQL i kodzie aplikacji:znalezienie substring_index w SQL niewłaściwego użycia, nawet jeśli jest ono osadzone w ciągach znaków w Pythonie, Javie lub Node.js.
  • Integruje się bezpośrednio z CI/CD pipelines: kompilacje kończą się automatycznie niepowodzeniem, jeśli są niebezpieczne funkcje łańcuchowe w SQL są wykrywane.
  • Zapewnia praktyczne porady dotyczące naprawy:pokazuje programistom, która część zapytania jest ryzykowna, dlaczego i jak to naprawić.

Przykładowy przepływ pracy z Xygeni w CI/CD bezpieczeństwo:

				
					Source → Commit → Build  
       → SQL Scan (Xygeni)  
       → Fail build if violations found  
       → Remediation & re-scan  
       → Merge & Deploy

				
			

Skanowanie ciągłe przed wdrożeniem krytycznym, zapewnia, że ​​ryzykowne użycie indeks_podciągu_sql są wykrywane nie tylko na etapie początkowego rozwoju, ale także w późniejszych aktualizacjach, refaktoryzacjach i zmianach zależności. To proaktywne podejście oznacza, że ​​luki są eliminowane, zanim dotrą do środowiska produkcyjnego.

Podsumowanie dla programistów – o substring_index w SQL

Oto podsumowanie:

  • Indeks podciągu SQL samo w sobie nie jest złe, ale niewłaściwe użycie może spowodować ukryty wyciek danych.
  • Każdy substring_index w SQL połączenia wykonywane na ścieżce wrażliwej pod względem bezpieczeństwa należy traktować jako podejrzane, dopóki nie zostanie udowodnione, że są bezpieczne.
  • Wszystkie funkcje łańcuchowe w języku SQL mogą okazać się niebezpieczne w sytuacjach, w których istotne są granice danych lub uprawnienia. Należy je zawsze traktować jako potencjalnie niebezpieczne w środowiskach wrażliwych, nawet jeśli wydają się proste lub nieszkodliwe.

Przydatne dalsze kroki dla zespołów programistów:

  1. Przeprowadź audyt swojej bazy kodu do jakiegokolwiek wykorzystania Indeks podciągu SQL w połączeniach, podzapytaniach lub logice kontroli dostępu.
  2. Dodaj SAST reguły do wykrywania dynamicznych ograniczników i niesprawdzonych danych wejściowych funkcje łańcuchowe w SQL.
  3. Przenieś parsowanie do warstwy aplikacji gdziekolwiek to możliwe.
  4. Uruchom ciągłe skanowanie przy użyciu narzędzi takich jak Xygeni, które wykrywają niebezpieczne zastosowania przed wdrożeniem.

Bezpieczeństwo nie polega tylko na łataniu luk po fakcie; chodzi o wbudowanie działań zapobiegawczych w proces pracy. Jeśli leczysz Indeks podciągu SQL i innych funkcji tekstowych w SQL z taką samą ostrożnością, z jaką traktujesz surowe dane wprowadzone przez użytkownika, unikniesz sytuacji, w której wygodna funkcja pomocnicza stanie się najbardziej niebezpiecznym wierszem zapytania.

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