Verkko-infrastruktuurin piilotettu miinakenttä: iso- ja pienikirjaimen ansa

Verkko-infrastruktuurin piilotettu miinakenttä: iso- ja pienikirjaimen ansa

Tou 06, 2026 security dns case-sensitivity web infrastructure authentication best practices domain management

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: strings Unicode-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:

  1. Kyseenalaistavat oletukset – Älä oleta normalisointia
  2. Testaavat reunatapauksia – Kirjainkoot kuuluvat turvatesteihin
  3. Dokumentoivat – Merkitse jokaisen systeemin toiminta
  4. Pitävät standardin – Yksi sääntö kaikkialle

Tulevat tutkijat (tai hyökkääjät) arvostavat.

Read in other languages:

RU BG EL CS UZ TR SV RO PT PL NB NL HU IT FR ES DE DA ZH-HANS EN