Den dolda fällan med skiftlägeskänslighet i din webbinfrastruktur
Verskaps-krisen som alla glömmer
Du kodar din webbapp. Allt flyter på i dev-miljön. Staging-servern beter sig perfekt. Men i produktion krashar det utan anledning – eller så dyker säkerhetsforskare upp med luckor du aldrig tänkt på.
Ofta ligger felet inte i koden eller valideringen. Det är versaler och gemener som hanteras olika på olika ställen.
Varför versaler skapar kaos
Alla vet att domain-namn ignorerar versaler. example.com, Example.Com och EXAMPLE.COM pekar sammastans. Enkelt.
Men tänk på:
- E-postadresser i ditt auth-system?
- User-ID:n i databasen?
- Filvägar i cloud storage?
- API-endpoints från externa tjänster?
- SSL-validering?
När din infra hanterar case folding olika skapar du en dörr öppen för attacker.
Ett verkligt attack-scenario
Tänk dig: Appen sparar e-post i gemener i databasen. Bra vana. Men OAuth-leverantören skickar Anna.Berg@exempel.se med versaler. Din login kod jämför strängar rakt av, utan normalisering.
Angriparen skapar konto med anna.berg@exempel.se. Sen loggar de in med den versala varianten. Om hanteringen skiljer sig kan de:
- Slippa rate limits (ses som ny user)
- Dubbla konton med högre rättigheter
- Undvika loggar
- Neka åtkomstkontroller
Värre med:
IDN-domäner – Unicode-regler varierar per språk. Turkisk 'ı' utan prick kraschar enkla ASCII-logiker. Vissa tecken saknar versal form.
Cloud storage – AWS S3-objekt är case-sensitive, men buckets inte. Fel här leder till dataläckage eller privilege escalation.
DNS – Queries är case-insensitive, men din app-validering kanske inte. Wildcard-cert och CNAME blir svaga punkter.
Så skyddar du din setup
1. Sätt normaliseringsregler tidigt
Bestäm hur versaler hanteras i appen, inte i databasen. Normalisera input direkt vid inmatning.
# Normalisera vid gränsen
def fixa_email(email):
return email.lower().strip()
def logga_in(email):
normal = fixa_email(email)
user = User.query.filter_by(email=normal).first()
return user
2. Välj Unicode-säkra bibliotek
För internationellt innehåll: Lita inte på hemmagjorda lösningar.
- Python:
unicodedata - JavaScript:
String.localeCompare() - Go:
stringsmed Unicode-stöd
3. Testa över hela kedjan
Appen lever inte ensam. Kolla case-beteende hos:
- DNS-leverantörens API
- SSL-utfärdare
- OAuth-partners
- Cloud storage
- CDN-regler
Dokumentera allt för konsistens.
4. Validera input stenhårt
Lita aldrig på externa system. Normalisera vid varje integration.
// Innan externa API-anrop
const fixa_for_api = (input, typ = 'lowercase') => {
let normal = typ === 'lowercase'
? String(input).toLowerCase()
: String(input);
return normal.trim();
};
5. Logga versalfel
Sätt upp varningar för misstänkta variationer:
def kolla_versaler(email):
normal = email.lower()
if email != normal:
logger.warning(f"Versalvariation: {email} → {normal}")
# Kolla efter attacker
6. NameOceans bästa praxis för domäner och DNS
Vid domain-registrering eller DNS-konfig hos NameOcean:
- Använd alltid gemener i koden för domains
- Håll DNS-poster konsekventa
- Utnyttja vår case-insensitive API
- Dokumentera strategin i din IaC
Slutsatsen
Säkerhet handlar inte bara om lösenord och HTTPS. Det är hela ekosystemets datahantering. En versalskillnad kan sprida sig genom auth, storage och API:er.
De som fixar det här tidigt:
- Ifrågasätter allt – Anta inget om normalisering
- Testar kanter – Versaler i säkerhetstesten
- Dokumenterar – Beskriv exakt hur systemen funkar
- Tvingar standard – Ett sätt överallt
Dina framtida säkerhetsgranskare (eller angripare) uppskattar det.