Ошибка django csrf при публикации с незащищенной на защищенную страницу

У меня есть формы входа на всех статических страницах. Я включил промежуточное ПО csrf в свой проект. Теперь, когда пользователь отправляет форму со статической страницы http, я получаю сообщение об ошибке,

csrf verification failed

Есть ли способ обеспечить межсайтовую проверку даже при публикации с незащищенной страницы на безопасную?

Я не хочу ни добавлять декоратор, освобожденный от scrf, ни менять страницу на https.

Это мой шаблон:

     <form action='{{login_url}}' method = 'post'>
            {% csrf_token %}

            <div class="searchbox login">
 <input autocomplete="off" id="id_fakeusername" type="text" name="fakeusername"    maxlength="100" value='Email' style="color: #727272" onfocus="$('#id_fakeusername').hide();$('#id_username').show();        

$('#id_username').focus();"  />

<input autocomplete="off" type='text' id="id_username" type="text" name="username"  maxlength="100" style="display: none" value='' onblur="if ($('#id_username').attr('value') == '') {$('#id_username').hide();$('#id_fakeusername').show();}"  />
        </div>
        <div class="searchbox login">
            <input autocomplete="off" id="id_fakepassword" type="text" name="fakepassword"  maxlength="50" style="color: #727272" value='Password' onfocus="$('#id_fakepassword').hide(); $('#id_password').show();  $('#id_password').focus();"  />

<input autocomplete="off" type='password' id="id_password" name="password" type="text"  style="display: none" value='' onblur="if ($('#id_password').attr('value') == '') {$('#id_password').hide();$('#id_fakepassword').show();}"  />
        </div>
            {% block nativewin %}
        <div class="loginbut"><input type="submit" border="0" title="Login" value="Login" /></div>
    {% endblock nativewin %}
    </form>

person Vivek S    schedule 20.09.2012    source источник


Ответы (2)


Из кода CsrfViewMiddleware [1]:

            # Suppose user visits http://example.com/
            # An active network attacker (man-in-the-middle, MITM) sends a
            # POST form that targets https://example.com/detonate-bomb/ and
            # submits it via JavaScript.
            #
            # The attacker will need to provide a CSRF cookie and token, but
            # that's no problem for a MITM and the session-independent
            # nonce we're using. So the MITM can circumvent the CSRF
            # protection. This is true for any HTTP connection, but anyone
            # using HTTPS expects better! For this reason, for
            # https://example.com/ we need additional protection that treats
            # http://example.com/ as completely untrusted. Under HTTPS,
            # Barth et al. found that the Referer header is missing for
            # same-domain requests in only about 0.2% of cases or less, so
            # we can use strict Referer checking.

Так что я думаю, что ответ на ваш вопрос "нет", используя встроенную защиту!

[1] https://github.com/django/django/blob/master/django/middleware/csrf.py#L118

person Steven    schedule 20.09.2012

Включили ли вы {{ csrf_token }} в свой шаблон ?

<form action="/contact/" method="post">{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="Submit" />
</form>

Вы включили RequestContext в render_to_response?

from django.template import RequestContext
from django.shortcuts import render_to_response

return render_to_response('contact.html', {'form': form},
                   context_instance=RequestContext(request))

Если это все еще не работает, выполните шаги, описанные в документы.

person Thomas Kremmel    schedule 20.09.2012
comment
да, я выполнил все шаги csrf, я вижу, как это работает, когда я публикую сообщения с защищенной страницы. но это не работает при публикации с http на https страницу - person Vivek S; 20.09.2012
comment
Просто чтобы понять ваш вариант использования. Почему вы хотите переключиться с http на https при отправке формы? Либо ваша форма представлена, отправлена ​​​​и проверена на странице, предоставленной http, либо на странице, предоставленной https. - person Thomas Kremmel; 20.09.2012
comment
мои статические страницы находятся в http и страница входа в https. У меня есть логин fom вверху всех статических страниц. Теперь, когда пользователь отправляет форму со статической страницы, я должен опубликовать ее на защищенной странице входа. - person Vivek S; 20.09.2012
comment
В порядке. Вот вопрос, который касается именно вашей проблемы. Надеюсь, это поможет: stackoverflow.com/questions/4078882/ или этот: stackoverflow.com /вопросы/6963491/ - person Thomas Kremmel; 20.09.2012
comment
да, я проверил этот вопрос, прежде чем писать сюда, у меня нет fast-cgi. я обслуживаю свой сайт с помощью apache - person Vivek S; 20.09.2012
comment
я думаю, что это связано со строгой проверкой реферера, как описано в пункте 4: docs.djangoproject.com/en/dev/ref/contrib/csrf/#how-it-works .. проверьте также этот документ: w3.org/Security/wiki/Same_Origin_Policy - person Thomas Kremmel; 20.09.2012