После переноса сайта с хостинга jino на webfaction, при попытке отправки любой формы возникала ошибка “CSRF token missing or incorrect”. Т.е. даже залогиниться на сайт было невозможно (авторизация через админку работала нормально и на сайте после я этого был авторизован).
CSRF - это уязвимость, когда пользователи, переходя по обычной ссылке, запускают хакерский скрипт, который может от их имени передать какую-либо форму на абсолютно другой сайт (например, оставить от их имени комментарий на одном из форумов или еще что-нибудь). Сам хакер не сможет получить результат перехода по ссылке. Собственно, это и отличает CSRF от XSS (http://www.securitylab.ru/analytics/292473.php).
Все описания этой ошибки ссылаются на документацию - https://docs.djangoproject.com/en/dev/ref/contrib/csrf/, либо советом добавлять во всех формах {% csrf_token %}
в темплейтах (у меня он везде добавлен) и проверить, есть ли в settings.py
в MIDDLEWARE_CLASSES
пункт 'django.middleware.csrf.CsrfViewMiddleware'
. Это все было. И не помогало.
Выход нашел, когда сравнил MIDDLEWARE_CLASSES от вебфакшна и джино.
webfaction:
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',
)
jino:
MIDDLEWARE_CLASSES = (
'django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
)
Поменяв на джиновские миддлвары - все запустилось и заработало нормально. Т.е., получилось, что ‘django.middleware.csrf.CsrfViewMiddleware’, в моем случае, не должна была быть в списке. Хотя, возможно, что после ее удаления, джанго просто не показывает ошибку, а уязвимость осталась. По крайней мере, на данный момент, проблему это решило. При следующей встрече, постараюсь решить эту проблему правильней, на данный момент знаний по этой теме не хватает.