Använd inte Server.HtmlEncode i javascript

Jag har tidigare skrivit om xss och hur man kan skydda sig mot det. En sak jag inte tar upp i det inlägget är bland annat hur man skyddar sig mot xss när man jobbar med användardata i javascript, exempelvis från ajaxanrop.

Server.HtmlEncode skyddar enbart mot xss i html, inte javascript. Ett exempel på det är att enkelfnutt ‘ inte omkodas av HtmlEncode, detta eftersom det tecknet i html är helt ofarligt, men i javascript kan det missbrukas.

Se exempelvis följande kod, som kan tyckas vara säker.

Rubrik: <a href="#" onclick="showmore();"><%= Server.HtmlEncode(message.Topic) %></a>
Text: <span id="divMessage"></span>
<script type="text/javascript">
    function showmore() {
        document.getElementById('divMessage').innerHTML = '<%= Server.HtmlEncode(message.Text)%>';
    }
</script>

Ovanstående kod skriver ut rubriken på ett meddelande och om man klickar på den så skriver den ut hela meddelandet i en span. Ett mer realistiskt scenario vore att funktionen gjorde att ajaxanrop som returnerade texten.

Ovanstående kod kan missbrukas exempelvis genom att vi sätter message.Text till följande

message.Text = "'; alert(\'annoying message\');'";

Vi får därför följande resultat
server-htmlencode-in-javascript
Detta eftersom htmlkoden blir följande:

function showmore() {
        document.getElementById('divMessage').innerHTML = ''; alert('annoying message');'';
    }

Om vi istället använder AntiXss och metoden JavaScriptEncode som hanterar utskrift av javascript på ett säkert sätt så får vi det resultat som vi förväntar oss.

Rubrik: <a href="#" onclick="showmore();"><%= Server.HtmlEncode(message.Topic) %></a>
Text: <span id="divMessage"></span>
<script type="text/javascript">
    function showmore() {
        document.getElementById('divMessage').innerHTML = <%= AntiXss.JavaScriptEncode(message.Text)%>;
    }
</script>

antixss-javascriptencode

Htmlkoden blir då följande

function showmore() {
        document.getElementById('divMessage').innerHTML = '\x27\x3b alert\x28\x27annoying message\x27\x29\x3b\x27';
    }

Kommentarer inaktiverade.

%d bloggare gillar detta: