6

私のサイトのCSRFDjangoミドルウェア(SVNトランクからのバージョン)から多くの障害が発生しています。発生するエラーは次のとおりです。CSRF障害:reason=CSRFトークンがないか正しくありません。

これらのCSRFエラーがどこから来ているのかをどのように診断できますか?自分でCSRFエラーを発生させることはできませんが、CSRFエラービューがトリガーされるたびにメールで通知するようにサイトを設定しているため、頻繁に発生していることがわかります。

4

4 に答える 4

15

私はそれを正しくするのに本当に苦労しましたが、結局はそうしました。これが私の主な問題です(Django 1.2ベータ版):

  1. 使用しているDjangoのバージョンに応じて、ミドルウェアが正しいことを確認してください。これは、オンラインのDjangoの文献で十分にカバーされています。
  2. フォームの開始タグの直後に、各フォームに{%csrf_token%}があることを確認してください
  3. これが私の主な問題でした。すべてのフォームに移動ページがあることを確認してください。つまり、フォームでaction=""を実行しないでください。
  4. 設定メールがすべて正しいものであることを確認してください。私はこのようなことをしなければなりませんでした:

    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'#上記と同じメール

    1. render_to_responseの最後にrequest_contextを追加します

    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をオフにするだけの人がたくさんいるからです。

于 2010-04-08T08:33:59.280 に答える
2

ミドルウェアがクロスサイトリクエストフォージェリ攻撃を正常に停止すると、CSRFエラーが発生するはずです。おそらく、これがWebサーバーのログをチェックする場合であり、以前のリクエストに関連していないリクエストが表示されることを確認するための最良の方法です。

于 2009-11-19T19:34:47.403 に答える
1

またMIDDLEWARE_CLASSESsettings.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インスタンスと順序付けでした。

于 2011-11-25T11:54:32.227 に答える
0

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=""

于 2011-09-23T18:24:09.473 に答える