2012-03-31 11 views
10

この質問は、コード作成の方法についての直接的なものよりも保険の再保険です。自己診断として私は専門家にそのようなことを依頼する可能性はあまりないので、ここで試してみる。CSRF免除はどのような場合に危険ですか?

私はジャンゴ・ドキュメント(https://docs.djangoproject.com/en/1.3/ref/contrib/csrf/)のドキュメントとそのページ上のいくつかの情報を読んでいる:http://cwe.mitre.org/top25/#CWE-352

限り私は理解しているとして、DjangoはAにトークン(ピンコードのいくつかの種類)を提供しますユーザー。それが本当に彼であることを確認するために、彼は次に彼が要求をするときにそれを返さなければなりません。また、Googleの一部の人々は、これがAJAXリクエストでも可能であることを発見しました。そのため、1.2.6以降の新しいポリシーを保護する理由があります。そして、CSRFは、誰かに偽装しているもの(悪い、危険なコード、破損したファイルなど)を私に与える人に関するものです。

だから私はこのようないくつかのコードを持っている場合:私は与えられた値を変換しようとする前に、データベースまたは自分のアプリケーションのどの部分へのアクセスを与えていないよと、保存する必要があります

@csrf_exempt  
def grab(request): 
    """ 
    view to download an item 
    POST because it stores that a user has downloaded this item 
    """ 
    item_id = request.POST.get('item', None) 
    if not loop: return HttpResponseBadRequest('no item id provided') 
    item = Item.objects.get(pk=int(item_id)) 

整数。ファイルをダウンロードしている人が間違っていると、あまりにも大きなダメージはありません(この場合はほとんどありません)。私はこの見解に依拠した法案を書くと仮定すると、CSRF免除はいろいろな形で違うでしょう(そうですか?)。

誰かがCSRFトークンをユーザーから盗んで、それを使って私(またはユーザー)を欺くことができない理由も理解できません。だから私はこのトピックに関するいくつかの質問を持っています:

1)上記の私の前提ですか?

2)誰かが私に教えてくれるかもしれませんが、何人かの素敵な人が上のビューを使って汚いトリックをすることができます。

3)は、man-in-the-middle攻撃の例です。それはちょうどそれに関係しているのですか、まったく違うものですか?

4)このような危険性についてさらに読むための貴重なリンクはありますか?

多分これらの質問のいくつかはあまりよく知られているとは言えませんが、私はそれを乗り越えようとしています。誰かが私を助けることができたらとても嬉しいです。

答えて

9

CSRF attacksは、犠牲者のブラウザが偽造要求を送ることを強要しています。簡単な<img>または自動的に提出された<form>は、GETメソッドとPOSTメソッドの両方でこれを行うには十分です。要求はブラウザから送信されるため、認証資格情報が送信されるため、基本的にユーザーの操作で開始されたものとは異なるものではないため、要求がサーバーの観点から見て正当で正当なものに見えるようになります。

これは、CSRFトークンが使用されているのとまったく同じです。つまり、ユーザーによって開始された要求とサードパーティのサイトによって偽造された要求との間に差異を設定します。この目的のために、CSRFトークンは、サーバおよびユーザにのみ知られている秘密として機能する。サーバーは秘密を文書の中に応答として入れ、次の要求でそれが返送されることを期待します。

秘密がこの特定のユーザーに割り当てられた応答文書に埋め込まれているため、攻撃者は特定の応答を盗聴したり、別の方法で文書にアクセスする必要があります。 CSRFトークン(例えば、eavesdropping,MITMXSSなど)が攻撃されることは確かです。しかし、あなたがこれらの攻撃から保護されている場合、攻撃者は本物の要求を偽造することはできません。

+0

トンネルの終わりに暗いライトが表示されています...もし私がサーバーに邪悪なものを送りたければ、まずいくつかのデータをいくつかのユーザーのブラウザに送る必要があります。このデータでは、攻撃を受けるサーバーに送信する自動的に送信するフォームを非表示にしています。彼はそこにアカウントを持っているので、ユーザーはそのサーバーにログインしていると仮定します。サーバーが何らかのトークンをチェックしなければ、そのリクエストは合法であったと考える必要があります。少なくとも私は今どのように動作しているのか、そしてMIMとXSSにラインを描くのはどこか考えています。ありがとうございました。 – marue

+0

@marue CSRFは悪意のあるデータをサーバーに送信することではありません。攻撃サイトが犠牲者のために正当で本物の要求を送ることができるため、主に偽装に関するものです。盗聴、MITM、およびXSSは、(ほとんどの認証管理スキームがCookieベースのセッションを使用するので、CSRFトークンを緩和する手段に過ぎません。代わりにセッションIDを取得することもできます)。 – Gumbo

+0

CSRFは、あなたが誰かではないふりをしていることを「唯一」していますか?重要なことだけを意味するのではなく、他のすべてが異なる攻撃方法です。 – marue

6

CSRF攻撃

私は(あなたはおそらくいくつかの権限を持っている)別のサイトにいくつかのコード(通常imgまたはformを通じて要求を、)挿入されたWebページを閲覧するにあなたをだまします。

無害例

<img src="http://www.yoursite.net/changelanguage?lang=fr"> 

私は残酷フランス語にあなたのセッションの言語を変更しました。ああああ! csrf保護を安全に削除し、dbヒットを保存できます。

危険な例

<img src="http://www.yourbank.net/sendmoney?amt=9999&account=123> 

あなたはyourbank.netにログイン(およびそれには、CSRFまたはその他の保護機能を持っていない)された場合は、あなたのアカウントは今では軽く感じるはずです。 (私は123です。)

adminとしてyoursite.netにログインしていた場合は、両方とも同じです。 (私は123です)

+1

これらの例を持つのに非常に役立ちます、ありがとうございます。 – marue

関連する問題