Jag fortsätter att gästblogga på webbsäkerhet.se, denna gången om att skydda sina användare ifrån cooke-theft via xss genom att använga sig av HttpOnly.

Gästbloggade i veckan på webbsäkerhet.se om cross site scripting och mvc, gå gärna över dit och läs inlägget!

Cross-site request forgery, även kallat CSRF och XSRF, är ett sätt att lura en användare att utföra saker den inte vill göra. T.ex kan någon ha postat följande som en kommentar på en sida som en inloggad användare går in på:

<img src="http://forumsite.com/?action=logout" />

Resultatet kommer bli att användaren loggas ut varje gång han går in på sidan och inte förstår varför då en GET-request gjordes mot http://forumsite.com/?action=logout. Detta är en ganska ofarlig handling men tekniken kan användas för andra saker så som att komma över användarnamn och lösenord vilket Johan Rydberg Möller har som exempel på webbsäkerhet.se. Jag läste hans inlägg om Cross Site request forgery där han visade PHP-kod för att motverka ett sådant försök att stjäla information och jag tänkte dra mitt strå till stacken och visa hur man gör samma kontroll i ASP.NET MVC:

Lägg in en AntiForgeryToken med hjälp av <%=Html.AntiForgeryToken()%> så att formuläret ser ut något likande detta:

<p>
    <% using (Html.BeginForm()){ %>
        <%=Html.AntiForgeryToken()%>
        Username: <%: Html.TextBox("username") %>
        Password: <%: Html.TextBox("password") %>
        <input type="submit" value="login" />
    <%} %>
</p>

I ActionResultet som tar emot postningen från formuläret läggs Action Filtret [ValidateAntiForgeryToken] till:

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Index(FormCollection formValues)
{
    return View();
}

Tas <%=Html.AntiForgeryToken()%> bort ifrån formuläret kommer det inte att gå att posta.

Ladda gärna ner exempelprojektet eller läs mer om CSRF på cgisecurity.com