Cross Site Injection

Senaste dagarna har ett stort antal sajter blivit utsatta för ett angrepp som lett till att besökarnas datorer infekterats med illvilliga program. Den teknik som använts kallas för cross site scripting, eller i det specifika fallet cross site injection och är tyvärr något man bör känna till.

Cross site scripting innebär att man lurar en vanligtvis pålitlig sajt att visa ett script för besökaren.

Ett exempel

Säg att jag besöker Facebook och hittar en sida eller funktion som är öppen för mina onda avsikter. Det kan finnas ett fält som jag som användare kan fylla i själv och vars innehåll visas för alla besökare till min Facebookprofil. Men istället för att ange de uppgifter som fältet är till för, så lägger jag in ett litet javascript som i sin tur laddar ett större script från en sajt jag har tillgång till.

När du senare besöker min sida kommer din webbläsare att ladda scriptet och köra den programkod som det innehåller. Beroende på vad jag förberett för elakheter och vilka säkerhetshål i din webbläsare mitt script kan upptäcka kan praktiskt taget vad som helst hända. Utan att du märker något kan scriptet installera program i din dator, radera filer eller sända dina privata filer till en server på nätet.

Osannolikt? Tyvärr inte. Facebook är kanske inte ett väl valt exempel, den är hyfsat säker mot cross site injection men ett par säkerhetshål upptäcktes där för bara några dagar sedan. Du besöker säkert många andra sajter och forum där besökare själva kan lägga in information och då finns en stor risk att exemplet blir verklighet.

Hur skyddar man sig?

Det enda du som användare kan göra för att skydda dig är att använda en modern webbläsare som uppdateras så snart något säkerhetsproblem blir känt (helst ska den förstås uppdateras innan hålet blir känt…). Du kan också stänga av scripthantering i din webbläsare, men det är inte ett särskilt praktiskt alternativ eftersom de flesta sajter helt enkelt inte fungerar då.

Hur skyddar jag användare på min egen sajt?

Om du själv bygger webbsajter så finns det en del att tänka på för att dina användare ska slippa bli utsatta för den här typen av problem.

Grundprincipen är att aldrig presentera information som användarna har matat in utan att först tvätta den ordentligt. För att bli av med giltiga html-taggar typ <script> kan man konvertera ’<’ och ’>’ till ”&lt;” och ”&gt;”. När webbläsaren presenterar detta kommer det att skrivas ut istället för att tolkas som en giltig html-tagg.

Exemplen nedan är inte på något sätt heltäckande, men det viktiga är att du förstår principen. Varje gång du presenterar information som en användare har lagt in måste du vara medveten om riskerna med cross site injection. Det ”rätta” sättet att skydda dina användare kan variera med funktionerna på din sajt.

Om du använder PHP

I PHP finns några standardfunktioner som gör mesta av jobbet åt dig, men du måste förstås se till att använda dem. htmlspecialchars() och htmlentities() konverterar alla specialtecken i HTML, tex ’<’ till ”&lt;”. strip_tags() tar bort alla html-taggar ur strängen utom de man uttryckligen sagt är tillåtna. (funktionsnamnen här är länkade till php-dokumentationen)

Studera php-dokumentationen för att lära dig skillnaderna, men i de flesta fall klarar du dig bra med htmlspecialchars(). Använd den när du ska skriva ut data som användare har lagt in. T ex:

$stringFromTheUser = "<script>alert('elakt script');</script>";
echo htmlspecialchars($stringFromTheUser);

Om du använder ASP.NET

ASP.NET har ett inbyggt skydd mot olämplig inmatning, men du kan inte förlita dig enbart på det. Det kan också finnas tillfällen när du behöver stänga av det, beroende på vilken sorts information du faktiskt tillåter att användaren lägger in.

För att vara säker på att du har det inbyggda skyddet aktiverat, se till att du har attributet validateRequest satt till true i sidan:

<%@ Page validateRequest="true" %>

När du skriver ut information som en användare lagt in, använd HttpUtility.HtmlEncode() för att konvertera alla specialtecken:

string stringFromTheUser = "<script>alert('elakt script');</script>";
response.write HttpUtility.HtmlEncode(stringFromTheUser);

Läs även den här artikeln på MSDN, men ta tipsen om att använda unika funktioner i Internet Explorer med en nypa sajt. Även om de i vissa fall går att använda som både hängslen och livrem kan du inte basera säkerheten på att användaren ska använda en viss webbläsare.


Publicerat

i

, , ,

av

Etiketter: