X-Content-Security-Policy på MozillaDanmark.dk

Af Jesper Kristensen, 31-08-2010 13:52

Firefox 4 er på trapperne (den er som jeg tidligere har nævnt i Beta lige nu), og den indeholder blandt andet nye sikkerhedstiltag, som hjemmesider kan gøre brug af. En af disse er Content Security Policy, forkortet CSP.

CSP er et ekstra lag af sikkerhed, man kan tilføje til sin hjemmeside. Lidt lige som User Access Control i Windows, Protected Mode i Internet Explorer og sandboxing i Google Chrome, giver CSP en ekstra beskyttelse, i tilfældet af at der skulle være et sikkerhedshul et eller andet sted. Men hvor de tre andre metoder er til styresystemer og programmer, er CSP til hjemmesider.

CSP er en HTTP header på en hjemmeside, som fortæller hvad hjemmesiden må gøre. Hvis en hacker får adgang til at smugle ondsindet kode ind på hjemmesiden, vil CSP i visse tilfælde kunne forhindre den i at gøre skade, da CSP-politikken ikke giver tilladelse til at gøre hvad end det ondsindede stykke kode måtte finde på. På http://mozilladanmark.dk/ ser CSP-headeren således ud:

X-Content-Security-Policy: allow 'none'; img-src 'self'; style-src 'self'; object-src 'self'; options inline-script

Her står at siden må indhente billeder, CSS style sheets og plugins fra samme domæne (mozilladanmark.dk), mens den ikke må hente nogen andre resurser nogen steder fra. Det kunne fx være scripts, videoer eller iframes. Billeder og style sheets bruger vi masser af, og plugins bruger vi på siden testjava.

Den sidste tilladelse i vores CSP er "options inline-script", som gør at vi kan udføre inline JavaScript på siderne produkter, thunderbird og kompozer. Egentligt burde jeg have placeret scriptet i en ekstern .js fil og brugt en "script-src 'self'"-tilladelse, men jeg var doven her. inline-script i CSP er kun tiltænkt til brug som en midlertidig overgang. I de fleste dynamiske hjemmesider laves HTML'en dynamisk, så at tillade script her er normalt usikkert. Med script-src har man bedre kontrol over hvorfra scriptet kommer. Det er de færreste hjemmesider der leverer dynamisk genereret indhold med en "Content-Type: application/javascript" HTTP header.

Ved at begrænse tilladelserne til nøjagtigt hvad siden bruger, sikrer vi at hvis en hacker får smuglet noget som helst andet ind, vil det blive afvist af Firefox 4. Det er vigtigt at være opmærksom på at CSP er et ekstra lag beskyttelse. Man skal stadig lave sin hjemmeside, så den er sikker uden CSP.

Jeg har kun tilføjet CSP til vores statiske sider under adressen http://mozilladanmark.dk/, hvilket ikke inkluderer vores forum, wiki og blog. Nu tænker du måske at jeg bruger CSP der hvor der er aller mindst brug for den, og du har da også ret. Grunden er at vi ikke selv laver vores forum-, wiki- og blog-software. Det er udviklerne af denne software, der skal anvende CSP, hvis de vil. Jeg har kun tilføjet CSP til de sider jeg selv har lavet.

Tilføjelsen af CSP har allerede afsløret en fejl på MozillaDanmark.dk. Vi bruger XHTML, vel at mærke HTML5-definitionen af XHTML, hvor siden læses af browserens XML-parser i stedet for HTML-parseren. XML-standarden dikterer at browseren ikke nødvendigvis skal stille HTML-entities til rådighed, når siden læses som XML. Det vælger Firefox dog at gøre, men det er stadig en god ide at lade være med at bruge dem, da andre browsere ikke nødvendigvis gør det. På vores thunderbird-side havde vi dog overset dette. Vi havde brugt HTML-entiteten ­, som jeg nu har udskiftet med XML-varianten ­. Grunden til at CSP fangede dette er relateret til følgende besked i Firefox fejlkonsollen:

CSP: Directive "allow 'none'" violated by resource://gre/res/dtd/xhtml11.dtd

Det betyder ganske enkelt at jeg i min CSP ikke har tilladt resource://gre, og at det derved ikke er tilladt for browseren at indlæse HTML-entities som fx ­ på siden.

CSP er i øjeblikket ikke en standard. Det er lavet af Mozilla og virker i øjeblikket kun i Firefox 4. Men andre browser-producenter (herunder IE-teamet) har givet rosende ord til CSP, så man kan håbe de også vælger at implementere det, hvis det bliver populært blandt hjemmesider. Af andre sikkerhedsnyheder i Firefox 4 kan nævnes X-Frame-Options, som dog også kommer i Firefox 3.6.9. X-Frame-Options er heller ikke en standard, og blev oprindeligt introduceret af Internet Explorer, men er nu understøttet af flere browsere. Hos MozillaDanmark bruger vi dog ikke X-Frame-Options, da alle de sider hvor det er relevant, er lavet af andre (forummet, wikien og bloggen), og at bruge det på sider, hvor det ikke er nødvendigt, har nogle ulemper. Fx vil sider der bruger X-Frame-Options ikke kunne ses i Google billedsøgning, da billedsøgningen netop indrammer siden i en frame.