如何解決Django中CSRF問題
阿新 • • 發佈:2018-12-01
CSRF是什麼?
CSRF(Cross Site Request Forgery,跨站偽造請求)。舉個例子來簡單介紹下。有A、B兩個web網站,其中A網站存在CSRF漏洞,B網站是攻擊者特意設計成一個具有CSRF攻擊性的網站,C為一普通使用者,當用戶C在瀏覽器中登入A網站後,A網站會將使用者的登入資訊如cookie返回並儲存在瀏覽器,如果使用者C在瀏覽器中再訪問B網站,B網站會誘導使用者C執行一個點選操作之類的,這個時候B網站就可以使用使用者C在A網站的登入態並偽造使用者C向網站A發起請求,而網站A卻不能分辨這個請求是來自於惡意攻擊網站B。因此為了網站的安全,我們都需要做CSRF防禦,確保每一次請求都是合法的。
Django中怎麼實現CSRF校驗?
Django不同版本對於csrf問題處理方式不太一樣,我用的Django2.0,在使用ajax請求時出現了csrf問題,網上找了一大堆的解決方案,有新增 @csrf_protect,有改settings.py檔案的,有改render方式等等,都沒有解決我的問題,去了Django官網搜了下ajax csrf關鍵字,按照官網提供的解決方案,csrf問題很快得到解決,先附上官方解決方案連結,主要是在html中增加下面幾段js程式碼即可。
<script type="text/javascript"> // 獲取csrftoken var csrftoken = getCookie('csrftoken'); $.ajax({ url:'xxx', type:'POST', data:{}, dataType: 'json', beforeSend: function(xhr, settings) { if (!csrfSafeMethod(settings.type) && !this.crossDomain) { xhr.setRequestHeader("X-CSRFToken", csrftoken); } }, success:function(r){ }, }) function csrfSafeMethod(method) { // these HTTP methods do not require CSRF protection return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method)); } 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 = jQuery.trim(cookies[i]); // 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; } </script>