2016-03-10 13 views
1

У меня есть форма в моем HTML:CSRF токен просто стреляет случайно в Джанго

<form id="form" action="" method="post"> {% csrf_token %} 
    <div>{{form.input1}}</div> 
    <div>{{form.input2}}</div> 
    <div>{{form.input3}}</div> 
    <input type="submit" class="btn" name="submit" value="submit"> 
</form> 

и в моем urls.py:

urlpatterns = [ 
    url(r'^$', views.MyView.as_view(success_url='/'), name='index'), 
] 

и иногда, когда я ударил представить, маркер CSRF получает срабатывает и говорит, что токен csrf отсутствует или неверен.

Прежде всего, как это возможно? Док говорит:

Обычно следует рассматривать только тогда, когда есть подлинный запрос Cross Site подлог, или когда из-за ошибки программирования, маркер CSRF не был включен с формой POST.

Из того, что я вижу, оно выполнено правильно.

сообщение об ошибке далее говорит

  • Ваш браузер принимает куки

это

  • Функция просмотра передает запрос на шаблон визуализируем метод

Согласно doc У меня есть это.

  • В шаблоне есть {% csrf_token%} Тег шаблона внутри каждой формы POST, который нацелен на внутренний URL-адрес

это действительно, но это все точки, имеющие Значок csrf правильно?

  • Если вы не используете CsrfViewMiddleware, то вы должны использовать csrf_protect на любые мнения, которые используют csrf_token тег шаблона, а также те, которые принимают данные POST.

В соответствии с документом это активируется по умолчанию.

Так почему же это срабатывает иногда (очень редко)?

+1

Возможно, что-то происходит с элементами формы (входы вытираются?) – bozdoz

+1

Вам нужно хотя бы показать пример вашей функции просмотра, передающей запрос. –

ответ

1

Поскольку вы говорите, что ошибка возникает только иногда, я думаю, проблема может заключаться в том, что вы открыли страницу с формой, вошли в систему на другой вкладке, а затем отправили форму.

Это вызывает ошибку, поскольку токен csrf обновляется при входе в систему. К сожалению, вы ничего не можете сделать по этому поводу.

+0

На самом деле это был правильный ответ, как я только что узнал. Нечего делать? – Tom

+1

Тонер CSRF вращается в целях безопасности. Я не знаю, что вы можете сделать, чтобы избежать ошибок csrf для пользователя. – Alasdair

2

Вы визуализируете свою форму динамически или что-то в этом роде? Django заменяет только {% csrf_token %} скрытым полем ввода и вводит файл cookie csrftoken, если этот тег присутствует в шаблоне с самого начала.

Сначала попробуйте украсить ваши взгляды с:

from django.views.decorators.csrf import ensure_csrf_cookie 

@ensure_csrf_cookie 
def index(request): 
    return render(request, 'index.html') 

Это всегда будет вводить печенье.

Если вы действительно динамически манипулируете формой, вам необходимо использовать файл cookie csrftoken вручную, чтобы получить токен csrf вручную, а затем отправить его по форме либо с помощью скрытого поля (дополнительного запроса), либо заголовка, как указано в документах.

+0

У нас была аналогичная проблема, которая произошла только на сафари, и с помощью декоратора исправил ее. – schwobaseggl

+0

ОК спасибо, поэтому я просто поместил декоратор где-нибудь в моих взглядах? Я сделал это. Есть ли шанс узнать, работает ли это, кроме как просто ждать, чтобы случайно возникнуть случайность? – Tom

+0

@PaulBernhardWagner Чтобы проверить, работает ли декоратор, вы можете проверять файлы cookie на представление, которое не имеет '{% csrf_token%}', и у него не должно быть файла cookie без декоратора. Чтобы проверить, помогает ли это в вашем случае, вам сначала нужно как-то воспроизвести проблему, не могу сказать без нее. Если это действительно то, что вызывает проблему, то да, вам нужно будет украсить все представления, или, по крайней мере, те, которые отправляют запросы. – serg

Смежные вопросы