developer tip

Django CSRF 프레임 워크를 비활성화 할 수 없으며 내 사이트가 중단됩니다.

copycodes 2020. 12. 26. 15:40
반응형

Django CSRF 프레임 워크를 비활성화 할 수 없으며 내 사이트가 중단됩니다.


django csrf 미들웨어는 비활성화 할 수 없습니다. 내 프로젝트의 미들웨어에서 주석을 달았지만 CSRF 문제가 없어 로그인이 실패했습니다. 저는 Django 트렁크에서 일하고 있습니다. CSRF가 미들웨어에서 활성화되지 않은 경우 어떻게 문제를 일으킬 수 있습니까?

CSRF가 중단하는 POST 요청이 내 사이트에 많이 있기 때문에 비활성화해야합니다. 장고 트렁크 프로젝트에서 CSRF를 완전히 비활성화하는 방법에 대한 피드백이 있습니까?

Django의 트렁크에있는 "새로운 'CSRF 프레임 워크는 또한 들어오는 외부 사이트를 깨고 내가 제공하는 URL에서 POST를 수행합니다 (이것은 편안한 API의 일부입니다). CSRF 프레임 워크를 다음과 같이 비활성화 할 수 없습니다. 아까 말했지만 어떻게 고칠 수 있습니까?


더 나은 솔루션을 보려면 아래 답변을 참조하십시오. 이 글을 쓴 이후로 많은 것이 변했습니다. 이제 CSRF를 비활성화하는 더 좋은 방법이 있습니다.

네 아픔이 느껴져. 프레임 워크가 이러한 기본 기능을 변경하는 것은 허용되지 않습니다. 지금부터 이것을 사용하고 싶어도 동일한 컴퓨터에 장고 사본을 공유하는 레거시 사이트가 있습니다. 이와 같은 변경에는 주 버전 번호 수정이 필요합니다. 1.x-> 2.x.

어쨌든, 그것을 고치기 위해 나는 그것을 주석 처리하고 Django 업데이트를 자주 중단했습니다.

파일 : django / middleware / csrf.py 160 행 주변 :

            # check incoming token
#            request_csrf_token = request.POST.get('csrfmiddlewaretoken', None)
#            if request_csrf_token != csrf_token:
#                if cookie_is_new:
#                    # probably a problem setting the CSRF cookie
#                    return reject("CSRF cookie not set.")
#                else:
#                    return reject("CSRF token missing or incorrect.")

예, Django csrf 프레임 워크를 비활성화 할 수 있습니다.

CSRF 미들웨어에 의해 처리되는 뷰 함수를 수동으로 제외하려면 django.views.decorators.csrf 모듈에있는 csrf_exempt 데코레이터를 사용할 수 있습니다. 예 : ( doc 참조 )

from django.views.decorators.csrf import csrf_exempt                                          
@csrf_exempt                                                                                  
def my_view:                                                                            
    return Httpresponse("hello world")

.. 그런 다음 {% csrf_token %}서식 파일에서 양식 내부 를 제거 하거나 양식에 포함하지 않은 경우 다른 항목은 변경하지 않고 그대로 둡니다.


미들웨어에서이를 비활성화 할 수 있습니다.

settings.py에서 MIDDLEWARE_CLASSES에 줄을 추가하십시오.

MIDDLEWARE_CLASSES = (

    myapp.disable.DisableCSRF, 

)

다음을 사용하여 myapp에서 disable.py를 만듭니다.

class DisableCSRF(object):
    def process_request(self, request):
        setattr(request, '_dont_enforce_csrf_checks', True)

기본적으로 요청에 _dont_enforce_csrf_checks를 설정하면 괜찮습니다.


일반적으로 CSRF 보호를 비활성화하면 안됩니다. 그렇게하면 보안 허점이 생기기 때문입니다. 그래도 주장한다면…

CSRF 보호를 수행하는 새로운 방법이 최근에 트렁크에 등장했습니다. 귀하의 사이트는 우연히 여전히 이전 방식으로 구성되어 있습니까? 다음은 The New Way ™ 에 대한 문서와 The Old Way ™에 대한 문서입니다 .


내 settings.py에서 csrf 미들웨어 클래스에 대한 참조를 제거하려고 시도했지만 작동했습니다. 이것이 허용되는지 확실하지 않습니다. 다른하실 말씀 있나요? 아래 두 줄이 제거되었습니다.

      'django.middleware.csrf.CsrfViewMiddleware',
      'django.middleware.csrf.CsrfResponseMiddleware',

내 장고 버전은 1.11입니다. 미들웨어는 다음과 같아야합니다.

from django.utils.deprecation import MiddlewareMixin


class DisableCSRF(MiddlewareMixin):
    def process_request(self, request):
        setattr(request, '_dont_enforce_csrf_checks', True)

참조 URL : https://stackoverflow.com/questions/1650941/django-csrf-framework-cannot-be-disabled-and-is-breaking-my-site

반응형