Jedna funkcija, široka površina za napad
Zamislite ovo: gradite mikroservis koji obrađuje registracije korisnika. Negdje u toku rada, skraćujete email adresu koristeći substring_index u SQL-u da dobijete domenu. Uredan je, kratak i odlično funkcionira u pripremi. Zatim, u produkciji, logovi počinju da se pune punim imenima i domenama e-pošte u običnom tekstu, što je slučajno curenje iz naizgled bezopasnog SQL poziva.
To je problem: SQL substring_index je jedna od onih string funkcija u SQL-u koja izgleda sigurno sve dok se ne koristi na pogrešnom mjestu. U SaaS aplikacijama ili sistemima s više zakupaca koji obrađuju osjetljive podatke, zloupotreba može otkriti privatne zapise ili čak omogućiti eskalaciju privilegija bez pokretanja očiglednih upozorenja. U kritičnim okruženjima, posebno platformama s više zakupaca gdje jedan upit može poslužiti više korisnika, mala logička greška razdjelnika u substring_index u SQL-u može dovesti do izlaganja podataka između zakupaca, curenja informacija između izoliranih skupova podataka.
Razumijevanje SUBSTRING_INDEX u stvarnom kodu
U MySQL-u i MariaDB-u, SQL substring_index prima tri argumenta: string koji treba obraditi, delimiter i count. Vraća dio stringa prije ili poslije tog delimitera.
Obično se koristi u upitima aplikacija za brzo dijeljenje strukturiranih vrijednosti pohranjenih u jednom polju, na primjer, dijeljenje e-pošte na korisničko ime i domenu, izdvajanje poddomene iz URL-a ili izoliranje prefiksa iz kompozitnog ključa. Programeri često biraju substring_index u SQL-u umjesto parsiranja na strani aplikacije jer je to...cise, izbjegava dodatnu obradu izvan baze podataka i može se direktno koristiti u filterima, spajanjima i operacijama grupiranja.
Primjer: Izdvajanje korisničkog imena i domene iz e-maila
sql SELECT SUBSTRING_INDEX(email, '@', 1) AS username, SUBSTRING_INDEX(email, '@', -1) AS domainOD korisnika;
Uobičajeni slučajevi upotrebe za substring_index u SQL-u uključuju:
- Izdvajanje korisničkih imena za poruke dobrodošlice
- Validacija email domena u odnosu na liste dozvoljenih/odbijenih adresa
- Grupiranje korisnika po domeni u analitičkim upitima
jer SQL-ov substring_index je prevaracisBrzo i jednostavno, programeri ga često koriste direktno u string funkcijama u SQL-u za filtriranje, validaciju ili izvještavanje. Problem počinje kada su delimiteri ili brojači dinamički i dolaze iz korisničkog unosa.
Gdje sigurnost propada – Substring_index u SQL-u
Tri glavna obrasca rizika okreću se substring_index u SQL-u u obavezu, posebno u sistemima s više zakupaca ili sistemima s visokim ulozima:
Prekomjerna izloženost podacima
U dijeljenoj bazi podataka, jedna greška koja se razlikuje za jedan ili pogrešan broj razdjelnika može otkriti osjetljive detalje od drugih zakupaca ili nepovezanih korisnika.
sql -- Intended: first name only SELECT SUBSTRING_INDEX(full_name, ' ', 1); -- Bug: leaks full name and extra fields SELECT SUBSTRING_INDEX(full_name, ' ', 3); U CRM-u s više zakupaca, ovo bi moglo otkriti puna imena kupaca iz drugih kompanija u izvezenom CSV-u zakupca.
Nulti ili neispravan unos
Ako nedostaje delimiter ili je ulaz null, SQL-ov substring_index može vratiti cijelo polje. U kritičnim sistemima, ovo bi moglo otkriti interne ID-ove, spojene metapodatke ili vrijednosti za otklanjanje grešaka koje nisu namijenjene za vanjsku vidljivost.
Neovlašteni pristup u spajanjima ili podupitima
U konfiguracijama s više zakupaca, nepažljiva upotreba string funkcija u SQL-u za određivanje opsega zakupca može prekinuti izolaciju:
SELECT o.id, o.amount, t.name FROM orders o JOIN tenants t ON SUBSTRING_INDEX(o.customer_ref, '-', 1) = t.tenant_code; If referenca_kupca je nedosljedno formatiran ili njime upravlja korisnik, Zakupac A bi mogao preuzeti narudžbe Zakupca B. U platnim sistemima ili zdravstvenim platformama, ovo postaje direktno kršenje politika odvajanja podataka.
Primjer rizika za više zakupaca: Zamislite SaaS platformu za fakturisanje gdje referenca_kupca kodira ID zakupca prije crtice (ID NARUDŽBE ZAKUPACA). Ako zlonamjerni korisnik pošalje referencu narudžbe s ID-om drugog zakupca, ali s važećim brojem narudžbe, a spajanje koristi substring_index u SQL-u bez validacije, mogli su pristupiti podacima faktura koje pripadaju potpuno drugoj organizaciji.
Pravi vektori napada u CI/CD i otvoreni kod
Zloupotreba SQL substring_index Nije samo greška juniora-developera; to se vidi u:
- ORM upiti s dinamičkim razdjelnicima
- Pohranjene procedure u dodacima otvorenog koda
- Inline SQL koji direktno spaja parametre zahtjeva
Kako nesiguran kod dospijeva u produkciju:
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 automatiziranih provjera nesigurnih string funkcija u SQL-u, ovi rizici mogu proći nezapaženo i stići do produkcije, potencijalno uzrokujući curenje osjetljivih podataka od prvog dana.
Detekcija u SAST/CI-CD
Najsigurniji način za rješavanje rizika substring_index u SQL-u obrasci su da ih blokiraju prije spajanja.
Pravila detekcije trebaju obuhvatiti:
- Korištenje SQL substring_index sa razdjelnicima ili brojevima iz parametara zahtjeva
- Nedostaje validacija razdjelnika
Primjer minimalnog pravila:
yaml rules: - id: mysql-substring-index-dynamic-delimiter languages: [sql] message: Avoid SUBSTRING_INDEX with dynamic delimiter or count. severity: error Pipeline korak:
yaml - name: SAST – SQL rules run: semgrep --config semgrep-sql.yml --error Skeniranjem nesigurnih string funkcija u SQL-u tokom PR provjera, uklanjate nagađanje iz pregleda koda.
Strategije ublažavanja za programere
Hvatanje rizične upotrebe SQL substring_index Uključivanje u preglede ili skeniranja je dobro, ali prava pobjeda nije njegovo uvođenje u prvom planu. Mnogi sigurnosni incidenti se događaju jer se programeri oslanjaju na poznate prečice bez razmatranja graničnih slučajeva.
Evo kako spriječiti probleme pri radu sa substring_index u SQL-u ili slične string funkcije u SQL-u:
Validirajte pozicije razdjelnika prije izvršenja
Nemojte samo pretpostavljati da delimiter postoji i da je na pravom mjestu. U sistemima s više zakupaca, jedan neočekivani delimiter u identifikatoru može otvoriti pristup podacima drugog zakupca.
sql SELECT CASE WHEN LOCATE('@', email) > 0 THEN SUBSTRING_INDEX(email, '@', 1) ELSE NULL END AS username FROM users; - Provjerite očekivanu dužinu izlaza
Postavite sigurne granice. Ako je rezultat podniza prekratak ili predug, tretirajte ga kao nevažeći. - Sanitizirajte i kodirajte podatke prije upotrebe
Uklonite neželjene razdjelnike iz korisničkog unosa prije nego što uopće dođe do SQL-a - izbjeći substring_index u SQL-u u sigurnosno kritičnoj logici
Nikada ga ne koristite za provjeru dozvola, izolaciju korisnika ili bilo šta što kontrolira pristup osjetljivim podacima. Parsiranje nije sigurnosna granica. - Premjestite parsiranje na sloj aplikacije. Logika na strani aplikacije vam daje bolju kontrolu nad validacijom, rukovanjem greškama i jediničnim testovima.
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 Tretiranjem string funkcija u SQL-u kao nepouzdanih kodnih putanja, smanjujete rizik od bilo kakve logičke greške.
Integracija sa sigurnosnim alatima
Čak ni vješti timovi ne mogu se oslanjati isključivo na ručne preglede; rizični obrasci poput nesigurnih SQL substring_index upotreba može proći neočekivano, posebno u velikim kodnim bazama ili pri radu s kodom treće strane.
Zašto integrirati alate poput Xygenija:
- Pokriva i kod otvorenog koda i vlasnički kod: osiguravanje da se ranjivosti ne kriju u paketima dobavljača ili naslijeđenim modulima.
- Detektira nesigurne obrasce u SQL skriptama i kodu aplikacije: pronalaženje substring_index u SQL-u zloupotreba čak i kada je ugrađena u stringove unutar Pythona, Jave ili Node.js-a.
- Integrira se direktno u CI/CD pipelines: izgradnje automatski ne uspijevaju ako su nesigurne string funkcije u SQL-u su otkriveni.
- Pruža praktične savjete za sanaciju: prikazivanje programerima tačno koji dio upita je rizičan, zašto i kako ga popraviti.
Primjer radnog procesa sa Xygeni-jem u CI/CD bezbjednost:
Source → Commit → Build → SQL Scan (Xygeni) → Fail build if violations found → Remediation & re-scan → Merge & Deploy Kontinuirano skeniranje prije implementacije je ključno, osigurava da rizične upotrebe sql substring_index se otkrivaju ne samo tokom početnog razvoja, već i u kasnijim ažuriranjima, refaktorisanjima i promjenama zavisnosti. Ovaj proaktivni pristup znači da se ranjivosti eliminišu prije nego što ikada dođu do produkcije.
Završne informacije za programere – O substring_index u SQL-u
Evo zaključka:
- SQL substring_index nije inherentno loše, ali loša upotreba ga pretvara u tiho curenje podataka.
- svaki substring_index u SQL-u Poziv u sigurnosno osjetljivoj putanji treba tretirati kao sumnjiv dok se ne dokaže sigurnost.
- Sve string funkcije u SQL-u mogu biti opasne u kontekstima gdje su granice podataka ili dozvole bitne; uvijek ih tretirajte kao potencijalno opasne u osjetljivim okruženjima, čak i ako izgledaju jednostavne ili bezopasne.
Sljedeći praktični koraci za razvojne timove:
- Revidirajte svoju kodnu bazu za bilo kakvu upotrebu SQL substring_index u spajanjima, podupitima ili logici kontrole pristupa.
- dodati SAST pravila za otkrivanje dinamičkih razdjelnika i neprovjerenog unosa u string funkcije u SQL-u.
- Prebacivanje parsiranja na sloj aplikacije gdje god je to moguće.
- Pokreni kontinuirano skeniranje s alatima poput Xygenija za otkrivanje nesigurne upotrebe prije implementacije.
Sigurnost se ne svodi samo na krpljenje rupa nakon što se to dogodi; radi se o uključivanju prevencije u radni proces. Ako liječite SQL substring_index i druge string funkcije u SQL-u s istim oprezom kao i sirovi korisnički unos, izbjeći ćete pretvaranje praktičnog pomoćnika u najopasniju liniju u vašem upitu.






