私のサイトのCSRFDjangoミドルウェア(SVNトランクからのバージョン)から多くの障害が発生しています。発生するエラーは次のとおりです。CSRF障害:reason=CSRFトークンがないか正しくありません。
これらのCSRFエラーがどこから来ているのかをどのように診断できますか?自分でCSRFエラーを発生させることはできませんが、CSRFエラービューがトリガーされるたびにメールで通知するようにサイトを設定しているため、頻繁に発生していることがわかります。
私はそれを正しくするのに本当に苦労しましたが、結局はそうしました。これが私の主な問題です(Django 1.2ベータ版):
設定メールがすべて正しいものであることを確認してください。私はこのようなことをしなければなりませんでした:
EMAIL_HOST ='mail.my-domain.com' EMAIL_HOST_USER='サーバー上の私のユーザー名'EMAIL_HOST_PASSWORD='passwd' EMAIL_PORT = '26'#私が読んだ多くのフォーラム投稿では25または26のようですDEFAULT_FROM_EMAIL = ' noreply@domain.com'#ホストされているドメインでは、設定されて送信されていることを確認してくださいSERVER_EMAIL ='noreply@domain.com'#上記と同じメール
return render_to_response('contact.htm'、{'favicon':r'____。ico'、'more_stuff': "......"'more_stuff': "......"'more_stuff': " ...... "}、 context_instance = RequestContext(request))
あなたが持っていることを確認してください:
TEMPLATE_CONTEXT_PROCESSORS = (
"django.contrib.auth.context_processors.csrf",
.....
)
settings.pyファイルにあります。
これは実際には方法ではないことに注意してください。これは私が私の仕事をするためにしたことです。今投稿する理由は、このトピックについて議論しているフォーラムで、csrf_tokenをオフにするだけの人がたくさんいるからです。
ミドルウェアがクロスサイトリクエストフォージェリ攻撃を正常に停止すると、CSRFエラーが発生するはずです。おそらく、これがWebサーバーのログをチェックする場合であり、以前のリクエストに関連していないリクエストが表示されることを確認するための最良の方法です。
またMIDDLEWARE_CLASSES
、settings.py
ファイル内のの順序を確認する必要があります。次のようになります。
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
最後に。私にとっての解決策は、RequestContext
インスタンスと順序付けでした。
GETリクエストのビュー関数が次のようになっていることを確認してください。
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>)
次に、ビューソースでnewform.htmlを確認します。これには、非表示フィールドが必要です。
<`form action="" method="post" name="loginform"> <`div style='display:none'`><`input type='hidden' name='csrfmiddlewaretoken' value='6f4dee99ab2f5e7201e057cb63' />
ここで、アクションは同じページを参照できますaction=""
。