Django 1.1.4 release notes¶
Välkommen till Django 1.1.4!
Detta är den fjärde ”bugfix”-releasen i Django 1.1-serien, som förbättrar stabiliteten och prestandan i Django 1.1-kodbasen.
Med ett undantag är Django 1.1.4 bakåtkompatibel med Django 1.1.3. Den innehåller också ett antal korrigeringar och andra förbättringar. Django 1.1.4 är en rekommenderad uppgradering för all utveckling eller distribution som för närvarande använder eller riktar in sig på Django 1.1.
För fullständig information om nya funktioner, inkompatibilitet bakåt och utdaterade funktioner i 1.1-grenen, se Django 1.1 release notes.
Bakåtkompatibla förändringar¶
CSRF-undantag för AJAX-förfrågningar¶
Django innehåller en CSRF-skyddsmekanism som använder sig av en token som infogas i utgående formulär. Middleware kontrollerar sedan att token finns när formuläret skickas in och validerar det.
Före Django 1.2.5 gjorde vårt CSRF-skydd ett undantag för AJAX-förfrågningar, på följande grunder:
Många AJAX-verktyg lägger till en X-Requested-With-header när XMLHttpRequest används.
Webbläsare har strikta policyer för samma ursprung när det gäller XMLHttpRequest.
I en webbläsare är XMLHttpRequest det enda sättet att lägga till en anpassad header av det här slaget.
För att underlätta användningen tillämpade vi därför inte CSRF-kontroller på förfrågningar som verkade vara AJAX på grundval av X-Requested-With-headern. Webbramverket Ruby on Rails hade ett liknande undantag.
Nyligen gjorde ingenjörer på Google medlemmar i Ruby on Rails-utvecklingsteamet uppmärksamma på en kombination av webbläsarplugins och omdirigeringar som kan göra det möjligt för en angripare att tillhandahålla anpassade HTTP-rubriker på en begäran till vilken webbplats som helst. Detta kan göra det möjligt för en förfalskad begäran att se ut som en AJAX-begäran och därmed besegra CSRF-skydd som litar på att AJAX-begäranden har samma ursprung.
Michael Koziarski från Rails-teamet uppmärksammade oss på detta, och vi kunde ta fram ett proof-of-concept som visade samma sårbarhet i Djangos CSRF-hantering.
För att åtgärda detta kommer Django nu att tillämpa fullständig CSRF-validering på alla förfrågningar, oavsett uppenbart AJAX-ursprung. Detta är tekniskt sett bakåtkompatibelt, men säkerhetsriskerna har bedömts vara större än kompatibilitetsproblemen i det här fallet.
Dessutom kommer Django nu att acceptera CSRF-token i den anpassade HTTP-rubriken X-CSRFTOKEN, liksom i själva formuläret, för enkel användning med populära JavaScript-verktyg som gör det möjligt att infoga anpassade rubriker i alla AJAX-förfrågningar.
Se CSRF-dokument för exempel på jQuery-kod som visar denna teknik, och se till att du tittar på dokumentationen för din version av Django, eftersom den exakta koden som krävs är annorlunda för vissa äldre versioner av Django.