programing

장고 CSRF 쿠키가 설정되지 않음

minimums 2023. 9. 5. 20:03
반응형

장고 CSRF 쿠키가 설정되지 않음

CSRF Cookie가 설정되지 않은 상태에서 잠시 문제가 발생했습니다.아래 코드를 참조하십시오.

views.py :

def deposit(request, account_num):
    if request.method == 'POST':
        account = get_object_or_404(account_info, acct_number=account_num)
        form_ = AccountForm(request.POST or None, instance=account)
        form = BalanceForm(request.POST)
        info = str(account_info.objects.filter(acct_number=account_num))
        inf = info.split()
        
        if form.is_valid():

            # cd=form.cleaned_data
            now = datetime.datetime.now()
            cmodel = form.save()
            cmodel.acct_number = account_num
            
            # RepresentsInt(cmodel.acct_number)
            cmodel.bal_change = "%0.2f" % float(cmodel.bal_change)
            cmodel.total_balance = "%0.2f" % (float(inf[1]) + float(cmodel.bal_change))
            account.balance = "%0.2f" % float(cmodel.total_balance)
            cmodel.total_balance = "%0.2f" % float(cmodel.total_balance)
            
            # cmodel.bal_change=cmodel.bal_change
            cmodel.issued = now.strftime("%m/%d/%y %I:%M:%S %p")
            account.recent_change = cmodel.issued
            cmodel.save()
            account.save()
            
            return HttpResponseRedirect("/history/" + account_num + "/")
        
        else:
            return render_to_response('history.html',
                                      {'account_form': form},
                                      context_instance=RequestContext(request))

템플릿 파일:

<form action="/deposit/{{ account_num }}/" method="post">
    <table>
        <tr>
            {{ account_form.bal_change }}
            &nbsp;
            <input type="submit" value="Deposit"/>
        </tr>
        {% csrf_token %}
    </table>
</form>

제가 막혀서 쿠키를 이미 지우고 다른 브라우저를 사용했지만 여전히 csrf 쿠키가 설정되지 않았습니다.

다음과 같은 경우에도 발생할 수 있습니다.CSRF_COOKIE_SECURE = True에 접속하지 않고 , 만약 ""가 ""일 경우"입니다.CSRF_COOKIE_HTTPONLY = True여기와 여기에 명시된 대로 설정됩니다.

from django.http import HttpResponse
from django.views.decorators.csrf import csrf_exempt

@csrf_exempt 
def your_view(request):
    if request.method == "POST":
        # do something
    return HttpResponse("Your response")

HTML5 Fetch API를 사용하여 로그인한 사용자로 POST 요청을 만들고 다음을 얻는 경우Forbidden (CSRF cookie not set.)그것은 기본적으로 그럴 수 있습니다.fetch세션 쿠키가 포함되어 있지 않기 때문에 장고는 사용자가 페이지를 로드한 사용자와 다른 사용자라고 생각합니다.

할 수 있는 을 전달하여 세션 토큰을 포함할 수 .credentials: 'include'가져올 항목:

var csrftoken = getCookie('csrftoken');
var headers = new Headers();
headers.append('X-CSRFToken', csrftoken);
fetch('/api/upload', {
    method: 'POST',
    body: payload,
    headers: headers,
    credentials: 'include'
})

페이지에서 보기에 esture_csrf_cookie 데코레이터를 추가하여 해결할 수 있습니다.

from django.views.decorators.csrf import ensure_csrf_cookie
@ensure_csrf_cookie
def yourView(request):
 #...

만약 이 방법이 효과가 없다면요.당신은 미들웨어에서 csrf를 코멘트하려고 할 것입니다.다시 테스트합니다.

당신이를 사용한다면, 당신의 하세요, 은 DRF를 잊어버렸을 것입니다. 잊어버린 것 같습니다..as_view():

그래서 내 코드는 다음과 같이 보였습니다.

urlpatterns += path('resource', ResourceView) 

그리고 그것이 바로 그것이 되어야 할 것입니다:

urlpatterns += path('resource', ResourceView.as_view())

DRF와 , 그은 DRF를 이었습니다. 해결책이 임박했습니다..as_view()에서 보기에 urls.py.

가 settings.py 에 설치되어 있는지 확인해 보십시오.

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

템플릿에서 데이터는 csrf_token으로 포맷됩니다.

<form>{% csrf_token %}
</form>

이 문제는 최근에 Python 자체의 버그로 인해 다시 발생했습니다.

http://bugs.python.org/issue22931

https://code.djangoproject.com/ticket/24280

영향을 받은 버전 중에는 2.7.8과 2.7.9가 포함되어 있습니다.값 중 하나에 다음이 포함된 경우 쿠키를 올바르게 읽지 못했습니다.[성격.

Python(2.7.10)을 업데이트하면 문제가 해결됩니다.

양식 작업을 설정하지 않은 경우에도 이 문제가 발생합니다.
" 코가다같을때이오표류시다습니었되가음과드다니습▁when▁for었표▁this"일 때 이 .

<form class="navbar-form form-inline my-2 my-lg-0" role="search" method="post">

내 코드를 다음으로 수정했을 때:

<form class="navbar-form form-inline my-2 my-lg-0" action="{% url 'someurl' %}" role="search" method="post">

제 실수가 사라졌습니다.

당신이 않경우는지를 .{% csrf_token %}렌더링할 템플릿의 태그입니다.장고가 csrftoken cookie를 설정하지 않습니다.

django가 csrftoken 쿠키를 설정하도록 하려면 보기에 esture_csrf_cookie 데코레이터를 추가합니다.

from django.views.decorators.csrf import ensure_csrf_cookie

@ensure_csrf_cookie
def myview(request):

저의 경우, 문제는 장고를 사용하고 있었다는 것입니다.rest_framework그리고 내 기능에 다음 장식자를 추가하는 것을 잊었습니다.

from rest_framework.decorators import api_view, renderer_classes

@api_view(('POST',))
@renderer_classes((JSONRenderer,))
def handle_web_request(request):
    ...

경우에는 내경우, 정설정을 합니다.CSRF_COOKIE_SECUREFalse충분하지는 않았지만 그것을 설정했습니다.Null작동한 매개 변수를 지정하지 않았습니다.

저의 경우 nginx의 정적 파일 경로가 잘못 지정된 것이 문제였습니다.

sudo tail -F /var/log/nginx/error.log

파일 경로에 오류가 있는지 확인합니다.

다음 오류가 발생하여 변경합니다.

<form method="post">

대상:

<form method="POST">

그리고 그것은 해결되었습니다! 단지 대문자로 글을 올리면 문제가 생깁니다! 저는 127.0.0.1에서 이것에 아무런 문제가 없지만, 제가 192.168.x.x 주소를 사용할 때 이것은 제 양식을 깨뜨렸습니다.

이 문가해않것같다니습는제지를 처리하지 않는 것 .GET먼저 양식을 가져오지 않고 데이터를 적절하게 또는 직접 게시하도록 요청합니다.

하면, 는 페지에처액하클면다전가다송니합음을트언라이이음세를 보낼 것입니다.GET요청합니다. 그런 경우에는 적절한 양식과 함께 html을 보내야 합니다.

나중에 사용자가 양식을 작성하여 전송합니다.POST양식 데이터가 포함된 요청입니다.

보기는 다음과 같습니다.

def deposit(request,account_num):
   if request.method == 'POST':
      form_=AccountForm(request.POST or None, instance=account)
      if form.is_valid(): 
          #handle form data
          return HttpResponseRedirect("/history/" + account_num + "/")
      else:
         #handle when form not valid
    else:
       #handle when request is GET (or not POST)
       form_=AccountForm(instance=account)

    return render_to_response('history.html',
                          {'account_form': form},
                          context_instance=RequestContext(request))

크롬의 쿠키가 웹 사이트에 대한 기본 옵션으로 설정되어 있는지 확인합니다.로컬 데이터를 설정할 수 있습니다(권장).

저는 예전에 장고 1.10을 사용했습니다.그래서 저는 이 문제에 직면했습니다.지금은 장고 1.9로 다운그레이드해서 정상적으로 작동하고 있습니다.

저도 같은 오류가 있었습니다. 저의 경우 method_decorator를 추가하면 다음과 같은 도움이 됩니다.

from django.views.decorators.csrf import csrf_protect
from django.utils.decorators import method_decorator

method_decorator(csrf_protect)
def post(self, request):
    ...

settings.py 에서 django 세션 백엔드가 올바르게 구성되었는지 확인합니다.그럼 이거 먹어봐요.

class CustomMiddleware(object):
  def process_request(self,request:HttpRequest):
      get_token(request)

를 이미웨추위에 합니다.settings.pyMIDDLEWARE_CLASSES또는MIDDLEWARE 버전에 .

get_token - POST 양식에 필요한 CSRF 토큰을 반환합니다.토큰은 영숫자 값입니다.토큰이 아직 설정되지 않은 경우 새 토큰이 만들어집니다.

한 번 만난 적이 있는데, 해결책은 쿠키를 비우는 것입니다. 디버깅 될 수 .SECRET_KEY관련된.

누군가가 같은 분야를 넘나들 수 있기 때문에 여기서 제 사례를 지적하고 싶습니다.

Forbidden (CSRF cookie not set.): /main/staff/products/validation/create
HTTP POST /main/staff/products/validation/create 403 [0.01, 127.0.0.1:55940]

이 일 때문에 미치겠어요CSRF 미들웨어에 대해 언급함으로써

 MIDDLEWARE_CLASSES = (
'django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
 # 'django.middleware.csrf.CsrfViewMiddleware',
)

그것은 나를

POST Method not allowed.

그게 결국 제 힌트였어요.Post 메서드가 있다고 확신했습니다.알고보니 나의url_patterns정규식 버그에 의한 다른 보기로 이어지고 있었습니다.

그래서 내가 무슨 짓을 했든 간에@csrf_exempt @ensure_crsf_cookie, 고찾있다.as_view()저는 잘못된 견해를 보고 있었습니다.

따라서 아무 것도 작동하지 않는 경우 실제로 올바른 보기로 전송되는지 확인합니다.

SSL이 없는 Django 애플리케이션을 배포하는 동안 이 오류가 발생할 수 있습니다. 이 경우 백엔드 앞에 SSL 역방향 프록시 또는 SSL 구성 입력을 배치하면 문제가 해결됩니다.

방법 1:

from django.shortcuts import render_to_response
return render_to_response(
    'history.html',
    RequestContext(request, {
        'account_form': form,
    })

방법 2:.

from django.shortcuts import render
return render(request, 'history.html', {
    'account_form': form,
})

왜냐면render_to_response메소드는 응답 쿠키의 일부 문제를 발생시킬 수 있습니다.

브라우저의 캐시를 지우는 것으로 이 문제가 해결되었습니다.저는 다른 프로젝트를 진행한 후 장고-블로그-지니아 튜토리얼을 하기 위해 현지 개발 환경을 전환하고 있었습니다.처음에, 저는 순서를 바꾸는 것을 생각했습니다.INSTALLED_APPS튜토리얼이 원인이 되었지만 캐시를 지울 때까지 수정할 수 없었습니다.

저는 이 해결책을 시도해 보았습니다. 저에게 효과가 있습니다.은 야해합니다설을 설정해야 .CSRF_USE_SESSIONSTrue기본적으로 csrf 토큰은 세션 https://docs.djangoproject.com/en/4.1/ref/settings/ #std-setting-CSRF_USE_SESSINS에 저장됩니다.

당신이 보기에 당신은 csrf 데코레이터를 사용하고 있습니까?

from django.views.decorators.csrf import csrf_protect

@csrf_protect def view(request, params): ....

언급URL : https://stackoverflow.com/questions/17716624/django-csrf-cookie-not-set

반응형