11

最近 Django 1.2.3 にアップグレードしたところ、アップロード フォームが壊れてしまいました。アップロードしようとすると、「CSRF 検証に失敗しました。リクエストは中止されました」というメッセージが表示されます。エラーメッセージ。

このテーマに関するDjango のドキュメントを読んだ後、テンプレートの HTML 内に {% csrf_token %} テンプレート タグを追加する必要があると記載されています<form>。残念ながら、my<form>は JavaScript (具体的には、Panel 上の ExtJs の「html」プロパティ) によって生成されます。

簡単に言えば、Django テンプレートに含まれていない<form>場合に、必要な CSRF トークン タグを追加するにはどうすればよいですか?<form>

4

6 に答える 6

13

別のオプションは、Django ドキュメントに示されている Cookie/ヘッダー ベースのソリューションを Ext に適合させることです。多数のテンプレートがあり、すべてを変更したくない場合に適しています。

次のスニペットを overrides.js (またはグローバルな変更を加えた場所) にドロップするだけです。

Ext.Ajax.on('beforerequest', function (conn, options) {
   if (!(/^http:.*/.test(options.url) || /^https:.*/.test(options.url))) {
     if (typeof(options.headers) == "undefined") {
       options.headers = {'X-CSRFToken': Ext.util.Cookies.get('csrftoken')};
     } else {
       options.headers.extend({'X-CSRFToken': Ext.util.Cookies.get('csrftoken')});
     }                        
   }
}, this);

(編集: Ext には既に Cookie 読み取り機能があり、複製する必要はありません)

于 2011-03-30T11:22:04.347 に答える
9

最も簡単な方法は、何もしない django を使用してページに非表示のフォームを作成することです。次に、JavaScript を使用してフォームをフェッチし、具体的にはフォームからトークン入力をフェッチします。最後に、そのトークン入力を動的に生成するフォームに挿入またはコピーします。

JavaScript のトークンを発行する方法の 2 つの例を次に示します。

<input id="csrf_token" value="{{ csrf_token }}"/>

<script type="text/javascript">
var CSRF_TOKEN = document.getElementById('csrf_token').value;
</script>

また

<script type="text/javascript">
var CSRF_TOKEN = "{{ csrf_token }}";
</script>
于 2010-09-21T21:29:32.323 に答える
1

より良い解決策は、ビュー/テンプレートから js ファイルのコードを生成することです。

次に、ビューで csrf トークンをコンテキストに設定できます...

from django.core.context_processors import csrf
context = RequestContext(request)
context.update(csrf(request))

次に、テンプレートで、 を使用{{ csrf_token }}して csrf トークンの生の値を取得し、それを使用してフォームに隠しフィールドを名前で作成できますcsrfmiddlewaretoken

于 2010-11-10T12:23:07.543 に答える
0

対象のビューPOSTも応答しGETますか? その中で、JS コードはGET問題のビューにリクエストを送信し、出力を解析して CSRF トークンを抽出できます。私の JS-fu は弱く、クライアント側からの解析をどのように行うのが最善かわかりません。

広く関連する例については、この質問を参照してください。この場合、ユーザーはPOSTPython スクリプトを使用しようとしましたが、同じ理由で失敗しました。解決策は同じでしたが、JavaScript ではなく Python スクリプトを使用する必要がありました。

于 2010-09-22T05:13:34.587 に答える
0

これは csrf トークンを使用するか、必要に応じて新しいトークンを自動生成します。ページ上のすべてのフォーム送信を処理します。オフサイト フォームがある場合は、このコードが実行されないようにする必要があります。

<script>
$(document).on('submit', 'form[method=post]', function(){
  if(!document.cookie.match('csrftoken=([a-zA-Z0-9]{32})')) {
    for(var c = ''; c.length < 32;) c += 'abcdefghijklmnopqrstuvwxyz'.charAt(Math.random() * 26)
    document.cookie = 'csrftoken=' + c + '; path=/'
  }
  if(!this.csrfmiddlewaretoken) $(this).append('<input type="hidden" name="csrfmiddlewaretoken">')
  $(this.csrfmiddlewaretoken).val(document.cookie.match('csrftoken=([a-zA-Z0-9]{32})')[1])
})
</script>

jQuery 1.7 以降が必要

于 2014-01-24T18:05:38.623 に答える
0

これは理想的ではないかもしれませんが、私にとっては最速の解決策でした。「本文」の下部にあるメイン テンプレートで、JavaScript 関数をライブラリに追加しました。

<script type="text/javascript">
    MyToolkit.Utils.getCSRFToken = function () {
         return "{% csrf_token %}";
    };
</script>
于 2011-10-12T16:06:59.200 に答える