2013-02-02 8 views
5

特定のGETリクエスト(例えば、^api/...)を保護するにはどうすればよいですか?Django Webアプリケーション内でのGETリクエストの保護

私はこのビュー(API呼び出し)を私のDjango Webアプリケーションだけで利用できるようにしたいと考えています。

これはDjango Webアプリケーションによってのみ呼び出され、直接は呼び出されません。

CSRFミドルウェアで生成されたハッシュキーを使用することをお勧めしますか?より良いアプローチはありますか?

+0

どうやってそれを呼びますか?アヤックスコール?または、内部的には、自分のアプリのWebサービスとして。 – santiagobasulto

+0

@santiagobasultoこれはAjaxの呼び出しですが、APIを公開することは望ましくありません。アイデアは、私が構築しているWebアプリケーションを介してのみ、このAPIを使用することです。 – abhiomkar

+0

私はこれについても興味があり、なぜこれをカバーするためにCSRFを拡張するのが一般的でないのだろうかと疑問に思っていますか?少なくとも、それはdjangoのドキュメントには書かれていないようです。すべてのAJAXコールをPOSTに切り替えてCSRF保護を起動できるようだが、それはかなりハッキリだと感じている。 – MichaelJones

答えて

0

これらを確認してください。replies、これは同じ問題を抱えているようです。私はrequest.META['REMOTE_ADDR']があなたのローカルアドレスと同じであるかどうかをチェックするデコレータを書いています。

2

これを達成するための信頼できる方法がないことは恐れがあります。私が考えることができる最善の方法は、あなたのjavascriptクライアントに秘密鍵を生成し、コードを解読することです。それは "attaker"があなたのメソッドを使うのを難しくします。たぶんHMACなどを使っているかもしれません。

例。次のコールをしたいとします:/api/users/1/vote_up

<script src="http://crypto-js.googlecode.com/svn/tags/3.1.2/build/rollups/hmac-sha256.js"> 

var hmac = CryptoJS.algo.HMAC.create(CryptoJS.algo.SHA256, generatePassphraseObfuscated()); 
hmac.update("/api/users/1/vote_up"); 
var hash = hmac.finalize(); 
$.ajax(
    /api/users/1/vote_up, 
    {hash: hash} 
) 
</script> 

generatePassphraseObfuscatedの機能がキーです。あなたはそれを複製することを本当に困難にする必要があります。また、リクエストごとに変更し、送信した「バージョン」を識別するためのCookieを追加することもできます。たとえば、次の2つのバージョンがあります。

function generatePassphraseObfuscated(){ 
    return 1; 
} 

function generatePassphraseObfuscated(){ 
    return 2; 
} 

ランダムに提供し、Cookieで識別します。だからあなたはあなたのdjangoビューで使うべきものを知っています。

また、信頼性が高くないため、やりたいことをするための確実な方法はありません。それは他の人が複製するのが醜いようにするばかげた方法です。

関連する問題