장고의 CSRF 유효성 검사를 비활성화하는 방법은 무엇입니까?
저는 csrf 프로세서와 미들웨어 라인에 대해 의견을 제시했습니다.settings.py
:
122
123 TEMPLATE_CONTEXT_PROCESSORS = (
124 'django.contrib.auth.context_processors.auth',
125 # 'django.core.context_processors.csrf',
126 'django.core.context_processors.request',
127 'django.core.context_processors.static',
128 'cyathea.processors.static',
129 )
130
131 MIDDLEWARE_CLASSES = (
132 'django.middleware.common.CommonMiddleware',
133 'django.contrib.sessions.middleware.SessionMiddleware',
134 # 'django.middleware.csrf.CsrfViewMiddleware',
135 'django.contrib.auth.middleware.AuthenticationMiddleware',
136 'django.contrib.messages.middleware.MessageMiddleware',
137 'django.middleware.locale.LocaleMiddleware',
138 # Uncomment the next line for simple clickjacking protection:
139 # 'django.middleware.clickjacking.XFrameOptionsMiddleware',
140 )
그러나 Ajax를 사용하여 요청을 보내면 Django는 여전히 'csrf token is incorrect or missing'이라고 응답하며, 헤더에 X-CSRFToken을 추가한 후 요청이 성공합니다.
이게 무슨 일입니까?
CSRF를 사용하지 않기 위해 몇 가지 보기만 필요하면 다음을 사용할 수 있습니다.@csrf_exempt
:
from django.views.decorators.csrf import csrf_exempt
@csrf_exempt
def my_view(request):
return HttpResponse('Hello world')
Django 설명서에서 더 많은 예제 및 기타 시나리오를 찾을 수 있습니다.
인setting.py
MIDDLEWARE에서는 다음 행을 간단히 제거/주석할 수 있습니다.
'django.middleware.csrf.CsrfViewMiddleware',
클래스 기반 보기에 대한 CSRF를 비활성화하기 위해 다음과 같은 작업이 가능했습니다.
저는 장고 1.10과 파이썬 3.5.2를 사용하고 있습니다.
from django.utils.decorators import method_decorator
from django.views.decorators.csrf import csrf_exempt
@method_decorator(csrf_exempt, name='dispatch')
class TestView(View):
def post(self, request, *args, **kwargs):
return HttpResponse('Hello world')
여기서 문제는 세션입니다.인증은 자체 CSRF 검증을 수행합니다.그렇기 때문에 CSRF 미들웨어에 주석이 달렸을 때도 CSRF 누락 오류가 발생합니다.모든 보기에 @csrf_exempt를 추가할 수 있지만 CSRF를 비활성화하고 전체 앱에 대한 세션 인증을 원한다면 다음과 같은 미들웨어를 추가할 수 있습니다.
class DisableCSRFMiddleware(object):
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
setattr(request, '_dont_enforce_csrf_checks', True)
response = self.get_response(request)
return response
내 앱/middle.py 에서 이 클래스를 만든 다음 설정에서 미들웨어로 이 미들웨어를 가져옵니다.파이의
MIDDLEWARE = [
'django.middleware.common.CommonMiddleware',
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
#'django.middleware.csrf.CsrfViewMiddleware',
'myapp.middle.DisableCSRFMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
그것은 django 1.11의 DRF와 함께 작동합니다.
장고 2의 경우:
from django.utils.deprecation import MiddlewareMixin
class DisableCSRF(MiddlewareMixin):
def process_request(self, request):
setattr(request, '_dont_enforce_csrf_checks', True)
해당 미들웨어를 다음에 추가해야 합니다.settings.MIDDLEWARE
적절한 경우(예: 테스트 설정에서).
참고: 설정이 호출되지 않았습니다.MIDDLEWARE_CLASSES
더이상.
답변이 부적절할 수도 있지만, 도움이 되길 바랍니다.
class DisableCSRFOnDebug(object):
def process_request(self, request):
if settings.DEBUG:
setattr(request, '_dont_enforce_csrf_checks', True)
이러한 미들웨어가 있으면 프로덕션 서버에서 요청을 디버그하고 csrf를 확인하는 데 도움이 됩니다.
글로벌에서 사용하지 않으려면 다음과 같은 사용자 정의 미들웨어를 작성할 수 있습니다.
from django.utils.deprecation import MiddlewareMixin
class DisableCsrfCheck(MiddlewareMixin):
def process_request(self, req):
attr = '_dont_enforce_csrf_checks'
if not getattr(req, attr, False):
setattr(req, attr, True)
그런 다음 이 클래스를 추가합니다.youappname.middlewarefilename.DisableCsrfCheck
로.MIDDLEWARE_CLASSES
목록, 이전django.middleware.csrf.CsrfViewMiddleware
이 솔루션을 사용하기 전에 설명서에서 이 링크를 읽어 보십시오.
저는 다음 두 단계로 이 문제를 해결했습니다.
이 클래스를 에 추가합니다.
utils.py
파일:from django.utils.deprecation import MiddlewareMixin from <your-project-name> import settings class DisableCSRF(MiddlewareMixin): def process_request(self, request): if settings.DEBUG: setattr(request, '_dont_enforce_csrf_checks', True)
그리고.
settings.py
파일, 위 미들웨어를 에 추가합니다.MIDDLEWARE
목록:... MIDDLEWARE = [ ... 'django.middleware.csrf.CsrfViewMiddleware', ... '<path-of-utils.py>.utils.DisableCSRF', ] ...
CSRF는 전체적으로 비활성화할 수 없는 보기 수준에서 시행할 수 있습니다.
어떤 경우에는 이것이 고통스럽지만, 음, "보안을 위한 것입니다.AAA 등급을 유지해야 합니다.
https://docs.djangoproject.com/en/dev/ref/csrf/ #오토바이와 오토바이가 있는 사람들
언급URL : https://stackoverflow.com/questions/16458166/how-to-disable-djangos-csrf-validation
'itsource' 카테고리의 다른 글
오라클 추적 파일에서 교착 상태 오류의 원인 찾기 (0) | 2023.07.21 |
---|---|
.gitignore 파일에 Django 마이그레이션 파일을 추가해야 합니까? (0) | 2023.07.16 |
Oracle 데이터베이스에 대량 삽입:커서 루프와 단순 선택 중 어느 것이 더 좋습니까? (0) | 2023.07.16 |
Ruby의 "continue"에 해당합니다. (0) | 2023.07.16 |
SQL Server에서 적용되는 인덱스 및 적용되는 쿼리란 무엇입니까? (0) | 2023.07.16 |