Django 管理者で uploadify を使用していますが、403 エラーが発生します。@csrf_exemptを使用するとエラーはなくなりますが、これは非常に危険です。
@csrf_exempt デコレーターを使用して、管理ページを危険にさらすことなくこの問題を解決するより良い方法はありますか?
前もって感謝します
Django 管理者で uploadify を使用していますが、403 エラーが発生します。@csrf_exemptを使用するとエラーはなくなりますが、これは非常に危険です。
@csrf_exempt デコレーターを使用して、管理ページを危険にさらすことなくこの問題を解決するより良い方法はありますか?
前もって感謝します
CSRFフレームワークで行われた変更に対応するには、あなたまたはそのパッケージの元の作成者のいずれかがパッケージを更新する必要があるようです。申し訳ありませんが、それは簡単な答えではありません...:/
ajaxリクエストがCookieを適切に送信していることを確認する必要があります。さらに重要なことは、投稿されたデータの一部としてCSRFトークンを送信していることです。CSRFセキュリティパッチの前は、クロスドメインで偽造することはできないと考えていたため、ajaxリクエストをCSRFで保護する必要はありませんでした。残念ながら、これは真実ではないため、それらにもCSRFトークンを要求する必要がありました。
特に、ドキュメントのこの関連部分を参照してください。
http://docs.djangoproject.com/en/dev/ref/contrib/csrf/#ajax
編集:
uploadifyのフラッシュ部分は何らかの理由でCookieを送信しないようです。AJAXヘッダーを送信していたため、おそらく以前は機能していました。今度は関係なくそのCookieを送信する必要があるため、ここでの正しい解決策は、Cookieを送信するようにフラッシュを変更することです。
@Paul McMillancsrf
ビューの保護で同じ問題に直面し、基本的なcsrf検証を提供するために小さくて醜い回避策を作成しました。コードは次のとおりです
from django.views.decorators.csrf import csrf_exempt
from django.middleware.csrf import CsrfViewMiddleware
def check_uploadify_csrf(request):
return CsrfViewMiddleware().process_view(request, check_uploadify_csrf, None, None) == None
@csrf_exempt
def some_view(request):
if check_uploadify_csrf(request):
# do some actions
@ginad uploadify オプションを使用formData
して csrf トークンをバックエンドに送信しました
formData: {csrfmiddlewaretoken: '{{ csrf_token }}'},
ありがとう、
スルタン
http://blog.fogtunes.com/2009/11/howto-integrate-swfupload-with-django/のおかげで問題を解決できました。
Javascript:
function getCookie(cname)
{
var i,x,y,ARRcookies=document.cookie.split(";");
for (i=0;i<ARRcookies.length;i++)
{
x=ARRcookies[i].substr(0,ARRcookies[i].indexOf("="));
y=ARRcookies[i].substr(ARRcookies[i].indexOf("=")+1);
x=x.replace(/^\s+|\s+$/g,"");
if(x == cname){
return unescape(y);
}
}
return false;}
data = { sessionid: getCookie('sessionid'), csrfmiddlewaretoken: csrf_token } $('#file_upload').uploadify({ // Cookie と csrftoken を渡します scriptData : data, .... // その他のコード });
ミドルウェア:
#insert after: 'django.middleware.common.CommonMiddleware'
def process_request(self, request):
if (request.method == 'POST'):
if request.POST.has_key('csrfmiddlewaretoken'):
request.COOKIES["csrftoken"] = request.POST['csrfmiddlewaretoken']
if request.POST.has_key('sessionid'):
request.COOKIES['sessionid'] = request.POST['sessionid']
Uploadify は Cookie を渡していないため、POST を使用して渡す必要があります。ビューを処理する前に、ミドルウェアが Cookie を設定します。