2012-04-22 1 views
4

중간 트래픽 (약 4000/5000 하루 방문)이있는 장고 웹 사이트가 있습니다. 오늘 settings.py에 "LOGGING"옵션을 구성하여 "Info"레벨의 이메일을 보내고 모든 것이 정상인지 확인하십시오.Django - 금지됨 (CSRF 쿠키가 설정되지 않음)

놀랍지 만 다음 오류가 발생했습니다 : [Django (외부 IP) 경고 : 금지

No stack trace available 

<WSGIRequest 
path:/cadastro/usuario/, 
GET:<QueryDict: {}>, 
POST:<QueryDict: {**xxxxxxx (some varibles....) and**: u'csrfmiddlewaretoken': [u'4wqRKQXZsTmXJaOkCsGobWyG1rzihc8x'], }>, 
COOKIES:{}, 
META:{'CONTENT_LENGTH': '381', 
'CONTENT_TYPE': 'application/x-www-form-urlencoded', 
'CSRF_COOKIE': 'qzc4i7JdHoQLJ8N5aI9MTlamOZMOKmP0', 
'DOCUMENT_ROOT': '/opt/nginx/html', 
'HTTP_ACCEPT': 'text/html, application/xhtml+xml, */*', 
'HTTP_ACCEPT_ENCODING': 'gzip, deflate', 
'HTTP_ACCEPT_LANGUAGE': 'pt-BR', 
'HTTP_CACHE_CONTROL': 'no-cache', 
'HTTP_CONNECTION': 'Keep-Alive', 
'HTTP_CONTENT_LENGTH': '381', 
'HTTP_CONTENT_TYPE': 'application/x-www-form-urlencoded', 
'HTTP_HOST': 'xxxxxx', 
'HTTP_REFERER': 'http://xxxx/y/z', 
'HTTP_USER_AGENT': 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 
'PATH_INFO': u'/y/z', 
'QUERY_STRING': '', 
'REMOTE_ADDR': '187.27.35.123', 
'REMOTE_PORT': '54221', 
'REQUEST_METHOD': 'POST', 
'REQUEST_URI': 'y/z', 
'SCRIPT_NAME': u'', 
'SERVER_NAME': 'xxxxxxx', 
'SERVER_PORT': '80', 
'SERVER_PROTOCOL': 'HTTP/1.1', 
'uwsgi.version': '0.9.6.5', 
'wsgi.errors': <open file 'wsgi_input', mode 'w' at 0xa126338>, 
'wsgi.file_wrapper': <built-in function uwsgi_sendfile>, 
'wsgi.input': <open file 'wsgi_input', mode 'r' at 0xa126a70>, 


'wsgi.multiprocess': True, 
'wsgi.multithread': False, 
'wsgi.run_once': False, 
'wsgi.url_scheme': 'http', 
'wsgi.version': (1, 0)}> 

내가이 오류를 재현 해 보았습니다. (CSRF 쿠키가 설정되지 않음),하지만 제 육체. Firefox 및 Chrome에서 테스트하고 모든 쿠키를 정리했습니다. 모든 것이 정상입니다. 하지만이 오류는 수십 시간 동안 계속 발생합니다. 항상 다른 IP를 사용하기 때문에 공격이 아님을 전제로합니다. 내 양식에 모두 {% csrf_token %}django.middleware.csrf.CsrfViewMiddleware MIDDLEWARE_CLASSES에 구성됩니다.

위 로그 메시지는 CSRF_COOKIE이 비어 있지 않음을 분명히합니다. 나는 장고 1.4를 사용하고있다.

[업데이트 됨] 나는이 논문 사용자가 쿠키를 사용할 수 없다고 생각합니다 ... 그래서 ... 문제는 : 쿠키를 사용하지 않는 사용자가 CSRF를 사용하는 방법입니다.

+0

클라이언트에서 쿠키가 활성화되지 않았습니까? 크롤러 또는 임의의 클라이언트 유형 일 수 있습니다. – jdi

+0

Hello Jdi, POST 변수 유효한 사용자 (크롤러가 아님)임을 알 수 있습니다. 클라이언트가 쿠키를 사용하지 않으면 "CSRF_COOKIE"가 비어 있지 않습니까? – Thomas

+0

Jdi, 방금이 테스트를 수행했습니다 ... firecookie로 CSRF_COOKIE를 제거했는데 오류가 발생했습니다. 이런 오류가 많이 발생하기 때문에 이것이 문제가 될지 모르지만 쿠키를 사용하도록 사용자에게 어떻게 경고 할 수 있습니까? – Thomas

답변

1

CSRF 오류로 인해 403 오류가 발생하면 오류가 표시됩니다.

쿠키가 활성화되지 않은 사용자에 대한 CSRF 보호를 처리하는 것에 대해 걱정할 필요가 없습니다. CSRF 공격의 본질은 브라우저 쿠키를 사용해야합니다. 사용하지 않으면 CSRF로 보호 된 요청이 실패합니다 (앞에서 보았 듯이). 따라서 귀하는 여전히 보호를받습니다.

장고 당신이 CSRF 실패의 경우에 클라이언트에 사용할 특정보기를 설정할 수 있습니다 : 정말 https://docs.djangoproject.com/en/dev/ref/settings/#std%3asetting-CSRF_FAILURE_VIEW

, 당신은 POST하려고하는 요청이 있습니다 이외의 아무것도 할 필요가 없습니다 서버에 잘못된 방법으로