본문 바로가기

Django

django / template csrf 문제해결

 

CSRF (Cross Site Request Forgery)

: 크로스 사이트 요청 위조, 사이트 간 요청 위조

 

웹 애플리케이션 취약점 중 하나로 사용자가 자신의 의지와 무관하게 공격자가 의도한 행동을 하여

특정 웹페이지를 보안에 취약하게 한다거나 수정, 삭제 등의 작업을 하게 만드는 공격방법을 의미한다 (나무위키)

 

 

장고내에서 위 에러를 해결하기 위해

 

form 태그에서 적용하는 방법과 Ajax 사용시 적용하는 방법 2가지가 나와있다.

 

 

 

 

Usage

 

1. Form 태그에서 적용방법

   - Form 태그 밑에 {% csrf_token %} 작성

<form method="post">
	{% csrf_token %}

 

 

 

2. Ajax 사용시 적용방법

   - 아래내용 적용 후 사용

 

function getCookie(name) {
    var cookieValue = null;
    if (document.cookie && document.cookie !== '') {
        var cookies = document.cookie.split(';');
        for (var i = 0; i < cookies.length; i++) {
            var cookie = cookies[i].trim();
            // Does this cookie string begin with the name we want?
            if (cookie.substring(0, name.length + 1) === (name + '=')) {
                cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
                break;
            }
        }
    }
    return cookieValue;
}

var csrftoken = getCookie('csrftoken');

function csrfSafeMethod(method) {
    // these HTTP methods do not require CSRF protection
    return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
}
$.ajaxSetup({
    beforeSend: function(xhr, settings) {
        if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
            xhr.setRequestHeader("X-CSRFToken", csrftoken);
        }
    }
});

 

 

이때 자주 사용하게 된다면 js 파일로 따로 뺀 후에 include 해서 사용하는것이 용이

  - js/csrf_token.js 파일에는 위에 코드가 들어간다.

 <script type="text/javascript" src="{% static 'js/csrf_token.js' %}"></script>

 

 

 

 

참고사이트 

https://docs.djangoproject.com/en/3.2/ref/csrf/

반응형