2012-04-20 14 views
11

私は長い時間前にCSRF聞いてきた、と私はほとんどの時間を聞くことがある:誰かがが自動的にフォームを送信しないように、CSRF攻撃から保護CSRF Protectionとは何ですか?

が重要です(ボットなどを使用)

まあ、それは100%真実ではありませんか?

私は約3年間ウェブスクレイピングを行ってきましたが、リクエストを行い、csrftokenmiddlewareフィールドを解析し、それを他のフィールドとともにPOSTするのはかなり簡単です。

これは本当に何のためですか?

+0

@agf私はちょうどその質問を読んで、私は重複を見ない ''( –

+0

確かに私は答えを今読んでいる...;) –

+2

あなたは "匿名"投稿を記述します。それは本当にログインしたユーザーの資格情報でその投稿を保護することです。 – Cheekysoft

答えて

8

はい、フォームをこすりし、CSRF対策トークンを取得することができます。しかし、あなたサイトをこすることなく、フォームを送信することはできません、あなたが他の誰かからトークンを取得して、フォームを送信することはできません - それは、セッションにリンクされています。これがCSRFの保護が実際にの場合、ユーザーがユーザーを騙してフォームを送信することを防ぎます。もともとDjango's comments framework and CSRFに応じて掲載CSRFsの


より一般的な説明、:

A CSRFは、許可なしに誰かがそれにアクセスするに権限を持っているリソースのトリック誰かにアクセスする攻撃です。

ので、例えば、CSRF保護はそれでスパムやマルウェアのリンクとコメントを投稿にユーザーをだましから誰かを防ぐことができます。あるいは、ユーザーが作成を誤ってウェブサーバーをクラッシュさせたり、検証プロセスを通過してデータベースに損害を与えたり、他の方法でサイトを侵害したりするコードを含めることができます。

ので、CSRFの保護なしで誰かが、理論的には、彼らが実際に書いていないコメントを投稿するにログインしているユーザーをだますことができます。 CSRF保護付き

、Djangoはそれはあなたのサイト上の実際のフォームから送信実際のデータではなかったことを検出し、それを拒否します。

1

これは、シナリオの異なるタイプの保護です。 攻撃者は、iframeまたはimg src-sのいずれかのjavascriptをログインしたユーザーがアクセスできる場所に挿入できます。 ユーザーがページにアクセスすると(コメントを含むページを言い、1つのコメントが攻撃者の投稿によってリンクを要求する)、そのリクエストはログインしたユーザーのブラウザによって、そのCookieとともに行われます。 CSRFは基本的に、この種のトリガーされた送信(単純なクライアント側送信)を保護します。もちろん、攻撃者はページをリクエストしてトークンを解析し、トークンを使って要求を作成できますが、ログインしたユーザーの横でこれを行うことはできません。

16

トランザクションを提出するには、以下のフォームでbanking.example.comでの電子バンキングのWebアプリケーションを想像してみて:攻撃者は、今でhacker.netでウェブサイトを設定することができ

<form action="/transaction" method="post"> 
    <input type="text" name="beneficiary"/> 
    <input type="text" name="amount"/> 
    <input type="submit" value="Pay"/> 
</form> 

<form action="https://banking.example.com/transaction" method="post" style="visibility:hidden"> 
    <input type="text" name="beneficiary" value="John Doe, Account No. 34-236326-1"/> 
    <input type="text" name="amount" value="1000000"/> 
    <input type="submit" value="Pay"/> 
</form> 
<script> 
    document.forms[0].submit(); 
</script> 

その後、攻撃者は被害者を訪問してhacker.netに訪問することになり、被害者のブラウザは電子バンキングアプリケーションにPOST要求を送信し、ハッカーに大きなトランザクションを行います。これは、被害者のブラウザが偽造POSTリクエストとともにセッションクッキーを電子バンキングアプリケーションにうれしく送信するためです。フォームがCSRFトークンによって保護されていた場合、攻撃者は犠牲者のブラウザに有効なPOST要求を送信させることができず、したがって攻撃は不可能になります。

このタイプの攻撃は、クロスサイトリクエスト偽造(CSRF)攻撃と呼ばれます。

また、CSRF攻撃は、電子バンキングやその他の重要なWebアプリケーションにログインしているときに、他のWebサイトを訪れたことがないというアドバイスを人々に与える理由でもあります。

CSRFトークンは、正規の権限を持つユーザが自動的に提出するWebフォームを保護しません。それを防ぐには、CAPTCHAを使用します。

+0

これは、サーバー側のリファラーの検証とどのように違うと思いますか? csrfクッキーをサポートせずにこの検証だけを行うと、私は引き続き攻撃を識別できます。 – Ethan

+0

私はリファラーが使われていない理由を知りました。時には機密情報を保持すると考えられるため、多くの場合ブロックされています。企業とそのプロキシは通常そのことを行います。ただし、HTTPSを使用すると、HTTPSがブロックされない可能性が高くなります。また、リファラーがなりすましをする可能性があるという記述もあります。 – Ethan

+0

CORSについて友達に連れて行くうちに、私は再びこの質問に出会った。 'document.forms [0] .submit();'は同じ起源のポリシーのためにとにかく動作しませんでしたか? –

0

あなたは、要求を行うcsrftokenmiddlewareフィールドを解析し、他のフィールドと一緒にそれを投稿する

することはできません。

あなたのサーバーがproperlyに設定されている場合、別のドメインのJSがドメインのデータをフェッチして使用してリクエストを構築できないためです。

CORSについて読んでください。

関連する問題