English 中文(简体)
Django CSRF Framework having many failures
原标题:
  • 时间:2009-11-19 18:59:57
  •  标签:
  • django
  • csrf

I m getting many failures from the CSRF Django middleware on my site (the version from SVN trunk.) The only errors I get are: CSRF failure: reason=CSRF token missing or incorrect.

How could I diagnose where these CSRF errors are coming from? I can t cause the CSRF errors myself, but I setup the site to email me whenever the CSRF error view is triggered so I know that it is happening often.

最佳回答

I really struggled to get it right, but eventually did. Here were my main issues (Django 1.2 beta):

  1. Make sure your middleware stuff is right, according to the version of Django that you are using. This is well covered in Django s literature online.
  2. Make sure that you have the {% csrf_token %} in each form,just following the opening tag for the form
  3. This was my main problem, make sure that all your forms have an go-to page, i.e. don t do action="" in your form.
  4. Make sure that your settings emails are all the right ones. I had to do something like this:

    EMAIL_HOST= mail.my-domain.com EMAIL_HOST_USER= my user name on the server EMAIL_HOST_PASSWORD= passwd EMAIL_PORT= 26 # often seems to be 25 or 26 on many of the forum posts I read DEFAULT_FROM_EMAIL= noreply@domain.com # on hosted domains, make sure it is set up and sending SERVER_EMAIL = noreply@domain.com # Same email as above

    1. Add the request_context to the end of your render_to_response

    return render_to_response( contact.htm ,{ favicon :r ____.ico , more_stuff :"......" more_stuff :"......" more_stuff :"......" }, context_instance = RequestContext(request))

Make sure you have:

TEMPLATE_CONTEXT_PROCESSORS = (
     "django.contrib.auth.context_processors.csrf",
     .....
   )

in your settings.py file.

Note that this is really not a how to, this is just what I did to get mine working. The reason for posting it now is that I see so many people on forums discussing this topic resort to just turning the csrf_token off.

问题回答

A CSRF error should happen when the middleware successfully stops a Cross Site Request Forgery attack. Probably the best way to verify that this is the case it to check your web server logs and you should see requests that aren t related to an earlier request.

Also you should check the order of the MIDDLEWARE_CLASSES in your settings.py file. Should look something like this:

MIDDLEWARE_CLASSES = (
     django.middleware.common.CommonMiddleware ,
     django.contrib.sessions.middleware.SessionMiddleware ,
     django.middleware.csrf.CsrfViewMiddleware ,
     django.contrib.auth.middleware.AuthenticationMiddleware ,
     django.contrib.messages.middleware.MessageMiddleware ,
     django.middleware.locale.LocaleMiddleware ,
)

LocaleMiddleware at the end. For me, the solution was the RequestContext instance and the ordering.

Make sure your view function for GET Request looks like this:

def login_view():
c = {}
c.update(csrf(request))
request.session.set_expiry(0)
if request.method ==  GET :
  return render_to_response( newform.html ,<b>c</b>)

Then check the view source for your newform.html, it must have Hidden field.

<`form action="" method="post" name="loginform"> <`div style= display:none `><`input type= hidden  name= csrfmiddlewaretoken  value= 6f4dee99ab2f5e7201e057cb63  />

Here, action can refer the same page, action="".





相关问题
How to get two random records with Django

How do I get two distinct random records using Django? I ve seen questions about how to get one but I need to get two random records and they must differ.

Moving (very old) Zope/Plone Site to Django

I am ask to move data from a (now offline) site driven by Plone to a new Django site. These are the version informations I have: Zope Version (unreleased version, python 2.1.3 ) Python Version 2.1....

Can Django models use MySQL functions?

Is there a way to force Django models to pass a field to a MySQL function every time the model data is read or loaded? To clarify what I mean in SQL, I want the Django model to produce something like ...

Flexible pagination in Django

I d like to implement pagination such that I can allow the user to choose the number of records per page such as 10, 25, 50 etc. How should I go about this? Is there an app I can add onto my project ...

is it convenient to urlencode all next parameters? - django

While writing code, it is pretty common to request a page with an appended "next" query string argument. For instance, in the following template code next points back to the page the user is on: &...

Pragmatically adding give-aways/freebies to an online store

Our business currently has an online store and recently we ve been offering free specials to our customers. Right now, we simply display the special and give the buyer a notice stating we will add the ...

热门标签