Django: защита от подделки межсайтовых запросов не работает при использовании с S3, Cloudfront
Я управляю статическими файлами, в том числе js
файлы, используя AWS S3
а также AWS CloudFront
,
У меня есть код отправки ajax POST
просьба (к одному из моих django
вид) а это a.js
файл находится в S3
,
Я понял, что столкнулся с какими-то междоменными проблемами, поэтому скопировал и вставил некоторые коды в https://docs.djangoproject.com/en/1.10/ref/csrf/. Вот мой js
код:
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;
}
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);
}
}
});
$.ajax({
type: "POST",
url: '/orders/pay-check/',
data: {
imp_uid : rsp.imp_uid,
merchant_uid : rsp.merchant_uid
}, // form date가 아니기 때문에, 맨위에 ajax cookie 세팅을 해줘야함
success: function(data) {
...
}
});
Но это происходит csrf_token
пропущенные ошибки! Поэтому я подробно рассмотрел этот код и попытался отредактировать некоторую часть кода:
Первый способ: Добавить POST
в csrfSafeMethod
и удалить this.crossdomain
,
function csrfSafeMethod(method) {
// these HTTP methods do not require CSRF protection
return (/^(GET|POST|HEAD|OPTIONS|TRACE)$/.test(method));
}
$.ajaxSetup({
beforeSend: function(xhr, settings) {
if (!csrfSafeMethod(settings.type)) {
xhr.setRequestHeader("X-CSRFToken", csrftoken);
}
}
});
Второй способ: просто добавь POST
в csrfSafeMethod
:
function csrfSafeMethod(method) {
// these HTTP methods do not require CSRF protection
return (/^(GET|POST|HEAD|OPTIONS|TRACE)$/.test(method));
}
$.ajaxSetup({
beforeSend: function(xhr, settings) {
if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
xhr.setRequestHeader("X-CSRFToken", csrftoken);
}
}
});
Третий способ: Добавить POST
в csrfSafeMethod
и изменить !this.crossDomain
в this.crossDomain
,
function csrfSafeMethod(method) {
// these HTTP methods do not require CSRF protection
return (/^(GET|POST|HEAD|OPTIONS|TRACE)$/.test(method));
}
$.ajaxSetup({
beforeSend: function(xhr, settings) {
if (!csrfSafeMethod(settings.type) && this.crossDomain) {
xhr.setRequestHeader("X-CSRFToken", csrftoken);
}
}
});
Но все эти случаи не сработали!!....
Очень хочу получить несколько советов. Благодарю.
** Редактировать **
Я получил что-то странное.
Если я открою Chorme development tool
консоль и печать document.cookie
, его вывод не включает csrftoken
который включен в мою локальную среду разработки.... только в производственной среде не отображается