Ошибка CSRF в Django после удаления скрытых полей - PullRequest
0 голосов
/ 13 октября 2011

Я получил несколько полезных советов по StackOverflow о том, как удалить все скрытые поля с помощью JavaScript.

Отправка формы отправляет пользователя на /submit, вызывая представление submit_form.В моем файле views.py я определяю свою индексную страницу (вместе с формой) и страницу, которая получает отправку (моя страница /index печатает ошибки для меня, но это ни на что не должно влиять):

def index(request, error_message = ''):
    t = get_template('index.html')
    html = t.render(Context( { 'ERROR_MESSAGE': error_message } ))
    return HttpResponse(html)

def submit_form(request):
    # get the POST data out of request and do something
    pass

Мне удалось устранить ошибку, изменив код на:

from django.contrib.csrf.middleware import csrf_exempt

@csrf_exempt
def submit_form(request):
    # get the POST data out of request and do something
    pass

По сути, это отключает CSRF для функции submit_form.Однако я уверен, что это не идеальное исправление (теперь я не проверяю подделки в моей форме).

Я пробовал более сложные исправления, такие как

  • Добавление этот код для непосредственного следования коду jQuery (который удаляет скрытые поля из отправки)
init:function(){
var ac=this

    # advice from StackOverflow to remove hidden 
    # fields from POST submission

    jQuery(document).ready(function($){
        $("form").submit(function() {
        $(this).find(":hidden").remove();
    });

# AJAX CSRF code inserted here
    #...
}

Я видел несколько вопросов, задающих подобные вещи (и ссылки в книге Django), но не видел простого и ясного ответа.Например, даже если я собирался допустить публикацию моего csrf_token (что, тем не менее, я знаю, это плохая идея), все еще неясно, следует ли мне отображать это на моей странице индекса (и тогда будет отправлена ​​форма, которая будет иметьтокен) или я должен сделать что-то в моем submit_form коде.Кодовая книга Django (см. Выше) использует my_view в качестве функции просмотра, в которой отображается токен;это имя не очень полезно!

У кого-нибудь есть небольшой пример работы CSRF (с изменением формы javascript)?Я действительно думаю, что было бы полезно (мне и многим другим людям в StackOverflow увидеть это. В идеале это было бы как можно проще (два представления: одно доставляет форму, другое печатает ее содержимое).

Большое спасибо за вашу помощь.


Обновление: Я все еще получаю эту ошибку, даже когда я предваряю csrfmiddlewaretoken от удаленияКогда я * не выполняю никакой обработки JavaScript, моя форма в порядке. И я проверил, что только мой

Есть ли какой-то способ, которым CSRF может видеть, что некоторые элементы формы удалены? Я не могу найтичто-то другое в моем QueryDict объекте (который отправляет данные из формы с помощью POST).

Я бы очень признателен за любую помощь!

1 Ответ

5 голосов
/ 13 октября 2011

Проблема в том, что вы удаляете скрытое CSRF-поле, и решение состоит в том, чтобы не удалять это поле, вы, вероятно, могли бы сделать это с помощью селектора jQuery, чтобы он игнорировал это поле с помощью: not (input [name = csrfmiddlewaretoken]) .

Кстати, у Django нет проблем с неизвестными именами полей, отправленных в класс формы, он с радостью проигнорирует их, поэтому компромисс по удалению скрытых полей очень мал.

...