Antixss med valfria html-taggar

Antixss är ett bra säkerhetsbibliotek för att undvika problem med xss. Jag vill här visa hur du kan använda antixss i kombination med lite egen kod för att kunna styra vilka taggar som skall få visas på sidan och inte. Exempelvis kanske man vill tillåta <img>-taggen men inte <div> eller <font>.

När antixss släpptes i version 3.1 kom även en rad nyheter. Bland annat Security Runtime Engine (SRE) som är en http modul som du helt enkelt lägger in i ditt asp.net projekt, konfigurerar att den skall skydda dina sidor och då får du direkt ett bra skydd mot xss-attacker.

Jag vill gärna kunna vara mer flexibel och exempelvis skydda bara delar av en sida. Det är också möjligt med antixss version 3.1 genom metoderna GetSafeHtml() och GetSafeHtmlFragment().

Det fina med GetSafeHtml är att den tar bort all eventuell skadlig kod, men förutom det så åtgärdar den även så all html blir korrekt.
Om vi exempelvis skickar in </div></div></div> till GetSafeHtml, så kommer den att returnera <div></div><div></div><div></div>. Detta gör den givetvis eftersom innehållet från en textbox kanske presenteras mitt i en sida bland andra div-element, vilket annars hade kunnat förstöra den övriga designen. Ett annat exempel är att den gör om <p><div></div></p> till <p></p><div></div><p></p>, detta eftersom en <p>-tagg inte kan innehålla en div.

Det jag tycker är synd med GetSafeHtml är att man inte själv kan konfigurera vilka taggar som skall skrivas ut som vanlig html-kod och vilka som skall köras genom HtmlEncode(). Jag satt precis med en uppgift där jag behövde den funktionen.

Lösningen blev att jag först kör HtmlEncode på alla taggar förutom de som explicit skall vara tillåtna. När det är gjort kör jag GetSafeHtml på det resultatet. Jag använder mig av reguljära uttryck för att välja ut html-taggarna.

I mitt exempel nedan kommer den att skriva ut taggarna <div>,<img> och <br> med attribut på ett säkert sätt.

String data = "exempeltext."; //Hämta data från valfri källa.

//Endast dessa taggar skall skrivas ut som html-kod, alla andra taggar skall 
//säkras via HtmlEncode()
String tags = "div|img|br"; 
String pattern = String.Concat(@"<(?!/?(", tags, @")( .*?|>)).*?>");

//Hämtar alla taggar som inte finns med i tags-variabeln
MatchCollection mc = Regex.Matches(data, pattern, RegexOptions.IgnoreCase);
foreach (Match match in mc)
{
    //Kör HtmlEncode på de taggar som hämtades med det reguljära uttrycket.
    data = data.Replace(match.Value, AntiXss.HtmlEncode(match.Value));
}

data = AntiXss.GetSafeHtml(data); //Kör GetSafeHtml på alla taggar som är kvar i vanlig html-form

Kommentarer inaktiverade.

%d bloggare gillar detta: