Undgå advarsler om usikkert indhold

Når man har truffet valget at dirigere sine besøgende til en SSL krypteret side, vil det oftest være i høj grad uhensigtsmæssigt, hvis browseren skulle finde på at komme med advarsler om, at siden indeholde usikre elementer.

IE6 - Mixed content warning
Eksempel på IE6 advarselsdialogboks

De logiske
Som ofte er tilfældet viser der sig i praksis at være forskel på hvordan markedets browsere håndterer sikkerhed – herunder er de selvskrevne kandidater til en checkliste for at undgå problemer er inkluderinger af eksternt indhold, som skal angives enten med en relativ eller HTTPS URI.

Værd at bide mærke i, i forhold til ovenstående er at følge op på hvad eventuelt 3. parts værktøjer som eksempelvis Google Analytics, Omniture og lignende indsætter af referencer – de fleste af disse har HTTPS-baserede ækvivalenter.

De bemærkelsesværdige
Hvad der formentlig er knap så indlysende er, at i Internet Explorer også <object codebase="..."> og <embed pluginspage="..."> skal angives relativt eller eksplicit med HTTPS. På trods af at browseren ikke gennemfører en request på URI’en, bliver der lavet en kontrol af overenstemmelse med dokumentets protokol.

Intuitivt eller ej, gør det sig også gældende for Internet Explorer, at eventuelle inkluderede URI’er der resulterer i en HTTP fejlkode, vil blive behandlet som usikre, idet det er browserens klassificering af sine egne fejlsider.

De lumske
Til gengæld er det formentlig kun blandt Microsofts egne udviklere indlysende, at brugen af iframe’s med enten tom eller ingen src-angivelse betragtes som en reference til HTTP og altså vil give en advarsel på en HTTPS side. Har man brug for den tomme iframe, kan eventuelt angives en reference til et tomt dokument, eller værdien “javascript:false

Sidst, men bestemt ikke mindst: Hvis der benyttes javascript der kalder removeChild() på et element der har et baggrundsbillede kan fejlen også optræde. Omgåelsen er nem: Sæt i stedet outerHTML='' (og nej, der er ingen logisk og rimelig grund til at tingene skal virke sådan).

De ligegyldige
Blandt de ting der kan ignoreres uden konsekvenser, er protokolangivelser i:

  • DOCTYPES
  • XHTML namespaces
  • Links

Forhåbentlig ovenstående kan redde uskyldige forbipasserende for timevis af fejlsøgning – kommer man alligevel dertil hvor der skal graves, er netværksovervågning et godt angrebspunkt – herfra er høstet gode erfaringer med både Ethereal og Fiddler.

Bemærk, at CONNECT requests altid vil ske via HTTP, men alt andet skal ske på HTTPS.

Geo IP redirigering

GeoLite City er et praktisk lille Open Source-værktøj fra firmaet MaxMind, som kan være til stor hjælp ved IP redirigering. Applikationen består i al sin enkelthed af en database-fil, samt en række C# klasser, som bruges til at tilgå databasen. Databasen kan bruges til at finde oplysninger om bl.a. land, landekode, region, by, postnummer, længde- og breddegrader og meget andet for en given IP-adresse.

Det Open Source API fra MaxMind som vi har anvendt består af seks C# klasser, hvoraf kun to skal instantieres for at benytte applikationen til fulde (der er API til yderligere programmeringssprog også, se forrige link). Det drejer sig om klasserne: LookupService og Location.

LookupService instantieres med en sti til databasen, samt (optionelt) en int, der fortæller om databasen skal læses direkte fra filen, eller gemmes i en buffer. Som standard læses der direkte fra filen, men i hastighedskritiske sammenhænge, kunne man muligvis ønske at cache databasen. Dernæst bruges LookupService objektet til at instantiere Location.

Location instantieres ved at kalde getLocation() på LookupService med den ønskede IP-adresse som parameter. Når det er gjort, er man klar til at udnytte de mange muligheder GeoLite City tilbyder. Dette gøres i første omgang ved at tilgå de public attributter der ligger i Location.

Dette eksempel udskriver land og breddegrad for IP-adressen, 208.77.188.166:
Bemærk at der kastes en exception hvis IP’en ikke findes, og koden bør derfor sættes i en try-catch blok.

LookupService ls = new LookupService(@"C:\...\...\GeoLiteCity.dat", GEOIP_STANDARD);
Location l = ls.getLocation("208.77.188.166");
Console.WriteLine("Land: " + l.countryName);
Console.WriteLine("Breddegrad: " + l.longitude.ToString());

Oplysninger om land ville i praksis f.eks. kunne bruges til, at redirigere en hjemmesidebruger hen til en version af siden i det pågældende lands sprog.

Man kunne også forestille sig, at en hjemmeside ønskede at vise mindre ressourcekrævende udgaver af siden til langsomme forbindelser. Her ville man også kunne benytte sig af GeoLite City. I dette tilfælde kunne koden se nogenlunde sådan her ud:
Bemærk at man her benytter LookupService og ikke Location.

int i = ls.getID("208.77.188.166");
if (i == LookupService.GEOIP_UNKNOWN_SPEED)
{
   Response.Redirect("http://example.net/standard.asp");
}
else if (i == LookupService.GEOIP_CABLEDSL_SPEED)
{
   Response.Redirect("http://example.net/fast.asp");
}
else if(i == LookupService.GEOIP_DIALUP_SPEED)
{
   Response.Redirect("http://example.net/slow.asp");
}

Her er et eksempel på en lille webapplikation, der oplyser land, by og koordinater for angivne IP adresser. Eksemplet vælger som standard www.hinnerup.net serverens globale IP. Der kan indtastes såvel IPv4 som IPv6 adresser i IP-adressefeltet.

GeoLite City kan hentes her og opdateres en gang om måneden.

Tavlemagneter behøver ikke være kedelige

Jeg har længe haft mig en 1.33 gHz T-Bird Athlon AMD processor tavlemagnet jeg lavede tilbage i universitetstiden. Det var på daværende tidspunkt muligvist den absolut dyreste tavlemagnet i verden, svarende til en værdi af omkring 3-4.000 kroner. CPU’en var sprit ny men desværre defekt ved levering, og jeg fik en ny tilsendt uden beregning til “lynet” (min første studie-pc).

Det er egentligt ganske nemt. Find en CPU, en anden chip, eller en del af en print-plade og sav løs. Lim så en neodymium magnet fast på bagsiden med sekundlim – og voilà: Et styk ganske dekorativ og anderledes tavlemagnet er skabt.

Samlingen blev udvidet her i dag, da jeg under oprydning i vores skur herhjemme fandt et gammelt ATI Rage Pro turbo AGP grafikkort.

Så nu pryder både en 1.33 gHz T-Bird Athlon AMD CPU, en ATI 3D Rage Pro Turbo GPU samt 4 stk GM72V161621 SDRAM chips firmaets whiteboardtavle.

Spast!