2012-08-05 9 views
5

Mamy małą witrynę, która dopiero zaczyna być wystawiona na zewnątrz. W większości przypadków działa bardzo dobrze, ale czasami otrzymujemy 403 błędy z komunikatem "CSRF FAILURECSRF cookie not set" z jednego z formularzy. Postać zdecydowanie ma {% csrf_token %} cenie, a nasze middleware wygląda następująco:Sporadic 403 Błędy "CSRF FAILURECSRSRF cookie not set" z django

MIDDLEWARE_CLASSES = (
    'django.middleware.csrf.CsrfViewMiddleware', 
    'django.middleware.common.CommonMiddleware', 
    'django.contrib.sessions.middleware.SessionMiddleware', 
    'django.contrib.auth.middleware.AuthenticationMiddleware', 
    'django.contrib.messages.middleware.MessageMiddleware', 
) 

forma działa dobrze dla większości ludzi, ale raz dziennie dostaję e-mail z przypadku awarii. Wiadomość e-mail zawiera rzeczywisty wniosek, który wygląda następująco (I zostały usunięte resztę danych POST, aby ukryć prywatne dane, ale opuścił csrfmiddlewaretoken):

<WSGIRequest 
path:/main/10/apply/, 
GET:<QueryDict: {}>, 
POST:<QueryDict: {u'csrfmiddlewaretoken': [u'IQQZvbVIggJm6Be6VinPHj8Qn3i3TdmG']}>, 
COOKIES:{}, 
META:{'CONTENT_LENGTH': '111978', 
'CONTENT_TYPE': 'multipart/form-data; boundary=----WebKitFormBoundaryLyo9BPXnAwKnt8ew', 
'CSRF_COOKIE': 'XmSPWJZk2UwS4PNBXRmVlAaYDDdNaGqk', 

CSRF_COOKIE nie odpowiada csrfmiddlewaretoken , co według mnie jest przyczyną problemu, ale nie mogę zrozumieć, jak są one niezsynchronizowane w przypadku niektórych zgłoszeń, ale nie w innych. Strona jest dość prostą formą z tylko kilkoma polami.

Jakieś sugestie, gdzie powinienem wyglądać? Używam najnowszego Django 1.4.1 na CentOS przy użyciu mod_wsgi przez apache.

Edit: Jedyną rzeczą, która wydaje się dziwne w porównaniu do udanych wniosków jest to, że tutaj sekcja COOKIES:{} jest pusta, co doprowadziłoby mnie podejrzewać, że być może po prostu mieć niepełnosprawne cookies w swojej przeglądarce, ale dlaczego pojawia się z CSRF_COOKIE w sekcji META?

Dzięki za pomoc!

Brandon

+0

Występuję właśnie w tym samym problemie. Czy kiedykolwiek wymyśliłeś rozwiązanie? –

+0

Sortuj. Problem polegał na tym, że niektórzy użytkownicy mieli wyłączone pliki cookie i nie ma sposobu, aby to naprawić ze strony serwera. Zakończyliśmy wyłączanie ochrony CSRF dla publicznej postaci stojącej. Nie rób tego dla stron logowania lub innych poufnych danych, ale ochrona CSRF nie zawsze jest niezbędna. – brandon

Odpowiedz

0

Czy HTTP_COOKIE jest puste?

Może to być django, który nie widzi pliku cookie CSRF w żądaniu i generuje nowy CSRF_COOKIE i umieszcza go w meta.

Powiązane problemy