[PYTHON] Django의 CSRF 유효성 검사를 비활성화하는 방법은 무엇입니까?
PYTHONDjango의 CSRF 유효성 검사를 비활성화하는 방법은 무엇입니까?
settings.py에서 csrf 프로세서 및 미들웨어 줄을 주석으로 처리했습니다.
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를 사용하여 요청을 보내면 장고는 여전히 'csrf 토큰이 잘못되었거나 누락되었습니다'라고 응답하고 헤더에 X-CSRFToken을 추가 한 후에 요청이 성공합니다.
여기서 무슨 일이 일어나고있는거야?
해결법
-
==============================
1.CSRF를 사용하지 않는 뷰가 필요한 경우 @csrf_exempt를 사용할 수 있습니다.
CSRF를 사용하지 않는 뷰가 필요한 경우 @csrf_exempt를 사용할 수 있습니다.
from django.views.decorators.csrf import csrf_exempt @csrf_exempt def my_view(request): return HttpResponse('Hello world')
여기에서 더 많은 예제와 다른 시나리오를 찾을 수 있습니다.
-
==============================
2.클래스 기반 뷰에 대해 CSRF를 비활성화하려면 다음 작업이 필요했습니다. django 1.10 및 python 3.5.2 사용
클래스 기반 뷰에 대해 CSRF를 비활성화하려면 다음 작업이 필요했습니다. django 1.10 및 python 3.5.2 사용
from django.views.decorators.csrf import csrf_exempt from django.utils.decorators import method_decorator @method_decorator(csrf_exempt, name='dispatch') class TestView(View): def post(self, request, *args, **kwargs): return HttpResponse('Hello world')
-
==============================
3.대답은 부적절 할 수도 있지만 도움이되기를 바랍니다.
대답은 부적절 할 수도 있지만 도움이되기를 바랍니다.
class DisableCSRFOnDebug(object): def process_request(self, request): if settings.DEBUG: setattr(request, '_dont_enforce_csrf_checks', True)
이와 같은 미들웨어를 사용하면 요청을 디버그하고 프로덕션 서버에서 csrf를 확인할 수 있습니다.
-
==============================
4.Global에서이 기능을 비활성화하려면 다음과 같이 사용자 정의 미들웨어를 작성할 수 있습니다.
Global에서이 기능을 비활성화하려면 다음과 같이 사용자 정의 미들웨어를 작성할 수 있습니다.
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)
django.middleware.csrf.CsrfViewMiddleware를 실행하기 전에 youappname.middlewarefilename.DisableCsrfCheck 클래스를 MIDDLEWARE_CLASSES리스트에 추가하십시오.
-
==============================
5.장고 2 :
장고 2 :
from django.utils.deprecation import MiddlewareMixin class DisableCSRF(MiddlewareMixin): def process_request(self, request): setattr(request, '_dont_enforce_csrf_checks', True)
해당 미들웨어는 적절한 경우 설정에 추가해야합니다 (예 : 테스트 설정에서).
참고 :이 설정은 더 이상 MIDDLEWARE_CLASSES로 지정되지 않습니다.
-
==============================
6.CSRF를 비활성화하여 자신의 미들웨어를 만들 수 있습니다.
CSRF를 비활성화하여 자신의 미들웨어를 만들 수 있습니다.
하나의 django app을 'Core'라는 이름으로 만들고이 app에서 하나의 파일 'utils.py'를 만들고이 파일의 코드 아래에 배치하십시오.
class DisableCSRF(object): def process_request(self, request): setattr(request, '_dont_enforce_csrf_checks', True)
그리고이 미들웨어를 MIDDLEWARE_CLASSES의 settings.py 파일에 포함 시키십시오.
'core.utils'
한 가지 더 방법 :
@csrf_exempt 데코레이터를 사용할 수 있습니다.
from django.views.decorators.csrf import csrf_exempt @csrf_exempt
-
==============================
7.MIDDLEWARE의 settings.py에서이 줄을 간단하게 제거하거나 주석 처리 할 수 있습니다 :
MIDDLEWARE의 settings.py에서이 줄을 간단하게 제거하거나 주석 처리 할 수 있습니다 :
'django.middleware.csrf.CsrfViewMiddleware',
-
==============================
8.CSRF는 전체적으로 비활성화 할 수없는보기 수준에서 시행 할 수 있습니다.
CSRF는 전체적으로 비활성화 할 수없는보기 수준에서 시행 할 수 있습니다.
어떤 경우에는 이것이 고통이지만, 음, "보안을위한 것"입니다. AAA 등급을 유지해야합니다.
https://docs.djangoproject.com/en/dev/ref/csrf/#contrib-and-reusable-apps
-
==============================
9.여기서 문제는 SessionAuthentication이 자체 CSRF 유효성 검사를 수행한다는 것입니다. 그렇기 때문에 CSRF 미들웨어에 주석이 달린 경우에도 CSRF 누락 오류가 발생합니다. 모든보기에 @csrf_exempt를 추가 할 수 있지만 CSRF를 비활성화하고 전체 응용 프로그램에 대해 세션 인증을 사용하려면 다음과 같은 추가 미들웨어를 추가 할 수 있습니다.
여기서 문제는 SessionAuthentication이 자체 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
myapp / middle.py에이 클래스를 만들었습니다. 그런 다음 미들웨어를 settings.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', ]
DRG와 함께 장고 1.11에서 작동합니다.
from https://stackoverflow.com/questions/16458166/how-to-disable-djangos-csrf-validation by cc-by-sa and MIT license
'PYTHON' 카테고리의 다른 글
[PYTHON] 내적을 계산하는 파이썬적인 방법은 무엇입니까? (0) | 2018.10.31 |
---|---|
[PYTHON] 팬더는 열을 가로 질러 합계를하고 그 값에서 각 셀을 나눕니다. (0) | 2018.10.31 |
[PYTHON] numpy를 사용한 하나의 핫 인코딩 (0) | 2018.10.31 |
[PYTHON] Tkinter "X"버튼 컨트롤 재정의 (창을 닫는 버튼) [duplicate] (0) | 2018.10.31 |
[PYTHON] hdf5 파일 결합 (0) | 2018.10.31 |