Verkko-infrastruktuurin piilotettu miinakenttä: iso- ja pienikirjaimen ansa
Kirjainkokojen hiljainen vaara
Rakennet web-sovellusta. Kehitysympäristössä kaikki sujuu. Testipalvelin pyörii moitteetta. Sitten tuotanto kaatuu outolla tavalla. Tai tietoturvatutkija löytää reiän, jota et osannut odottaa.
Syy ei ole bugi koodissa tai puuttuva tarkistus. Usein taustalla on kirjainkokojen ristiriita: järjestelmäsi käsittelee isoja ja pieniä kirjaimia eri tavalla.
Miksi kirjainkoot yllättävät
Domain-nimet ovat case-insensitive. example.com, Example.com tai EXAMPLE.COM – kaikki sama. Perusasiat kunnossa.
Mutta entä nämä?
- Sähköpostit tunnistautumisessa?
- Käyttäjätunnisteet tietokannassa?
- Tiedostopolut pilvipalvelussa?
- API-päätepisteet?
- SSL-varmenteiden tarkistus?
Kun infrastruktuuri noudattaa eri case folding -sääntöjä, syntyy haavoittuvuus.
Todellinen hyökkäysskenaario
Sovelluksesi tallentaa sähköpostit pienillä kirjaimilla tietokantaan. Hyvä käytäntö. OAuth-palvelu lähettää John.Smith@gmail.com sekaisin isoilla ja pienillä.
Hyökkääjä rekisteröityy john.smith@gmail.com:lla. Kirjautuu sisään. Kokeilee sitten John.Smith@gmail.com:ia. Jos käsittely ontuu, hän voi:
- Ohittaa rajoitukset (eri käyttäjäksi tulkittu)
- Luo kaksoistilejä korkeammilla oikeuksilla
- Piiloutua lokituksista
- Päästä luvattomiin tietoihin
Ongelma pahenee kansainvälisten domainien kanssa. IDN:t noudattavat kielikohtaisia Unicode-sääntöjä. Turkin dotless i rikkoo perinteiset oletukset. Jotkut merkit eivät muutu isoiksi.
Pilvitallennuksessa AWS S3:n object keyt ovat case-sensitive, mutta bucket-nimet eivät. DNS-kyselyt case-insensitive, mutta sovelluksesi tarkistus ei välttämättä.
Suojaa infrastruktuuri
1. Määritä yhtenäiset säännöt
Päätä case-käsittely sovellustasolla heti syötteen rajalla. Älä jätä tietokannalle.
# Normalisoi heti
def normalisoi_email(email):
return email.lower().strip()
def tarkista_kayttaja(email):
norm_email = normalisoi_email(email)
kayttaja = User.query.filter_by(email=norm_email).first()
return kayttaja
2. Hyödynnä Unicode-työkaluja
Kansainvälisille teksteille älä keksi pyörää uudelleen. Käytä valmiita kirjastoja:
- Python:
unicodedata - JavaScript:
String.localeCompare() - Go:
stringsUnicode-tuella
3. Testaa koko ketju
Sovellus elää ekosysteemissä. Tarkista kirjainkoot:
- DNS-palvelun API:ssa
- SSL-varmenteiden tarkistuksessa
- OAuth-palveluissa
- Pilvitallennuksessa
- CDN-säännöissä
Kirjaa kunkin toiminta ja varmista yhtenäisyys.
4. Tarkista syötteet tiukasti
Älä luota ulkopuolisiin. Normalisoi jokaisessa rajapinnassa.
// Ennen API-kutsua
const normalisoi_api = (syote, muoto = 'lowercase') => {
let norm = muoto === 'lowercase'
? String(syote).toLowerCase()
: String(syote);
return norm.trim();
};
5. Seuraa poikkeamia
Ilmoita epäilyttävistä variaatioista.
def havaitse_kirjainvaihtelu(email):
norm = email.lower()
if email != norm:
logger.warning(f"Kirjainvaihtelu: {email} vs {norm}")
# Tutki hyökkäys
6. NameOceanin suositukset
Domain-rekisteröinnissä ja DNS:ssä NameOceanin kautta:
- Käytä aina pieniä kirjaimia koodissa
- Pidä DNS-rekisterit yhtenäisinä
- Luota API:n case-insensitive -toimintoihin
- Dokumentoi strategia infra-koodiin
Oppitunti
Turvallisuus on enemmän kuin salasanat ja HTTPS. Se on koko ketjun datahallinta. Yksi kirjainkokovirhe leviää authista tallennukseen ja API:hin.
Parhaat kehittäjät:
- Kyseenalaistavat oletukset – Älä oleta normalisointia
- Testaavat reunatapauksia – Kirjainkoot kuuluvat turvatesteihin
- Dokumentoivat – Merkitse jokaisen systeemin toiminta
- Pitävät standardin – Yksi sääntö kaikkialle
Tulevat tutkijat (tai hyökkääjät) arvostavat.