53

私は人々がこのように投票できるウェブサイトを持っています:

http://mysite.com/vote/25

これにより、アイテム 25 に投票が行われます。これは、登録ユーザーのみが利用できるようにしたいと考えています。今では、誰かがウェブサイトで忙しくしていることを知り、誰かが次のようなリンクを提供します:

http://mysite.com/vote/30

その後、投票は、彼がこれをしたくなくても、アイテムに彼のための場所になります.

OWASP の Web サイトの説明を読みましたが、よくわかりません。

これはCSRFの例ですか、どうすればこれを防ぐことができますか? 私が考えることができる最善のことは、ハッシュのようなものをリンクに追加することです. しかし、これはすべてのリンクの最後に何かを配置するのは非常にイライラします。これを行う他の方法はありませんか。

ウェブサイトは私にはかなり曖昧に見えるので、誰かがこれの他の例を教えてくれるかもしれません.

4

4 に答える 4

95

これは、次の場合にCSRFの例になる可能性があります。

  • そのリンクは(たとえば、タグを介して<img>)フェッチされます:偽造
  • 別のサイトから:クロスサイト


たとえば、この<img>タグをstackoverflowのHTMLソースコードに挿入できる場合(stackoverflowでは投稿でタグを使用できるため<img>) :

<img src="http://mysite.com/vote/30" />

あなたはそのアイテムに投票したでしょう;-)


一般的に使用される解決策は、有効期間が制限されているトークンをURLに配置し、URLがフェッチされたときに、このトークンがまだ有効であることを確認することです。

基本的な考え方は次のとおりです。

  • ページを生成するとき:
    • 一意のトークンを生成する
    • ユーザーのセッションに保存します
    • そしてそれをページのリンクに配置します-これは次のようになります:http://mysite.com/vote/30?token=AZERTYUHQNWGST
  • 投票ページが呼び出されたとき:
    • トークンがURLに存在するかどうかを確認します
    • ユーザーのセッションに存在するかどうかを確認します
    • そうでない場合=>投票を登録しない

そこにある考え:

  • トークンの寿命は長くなく、推測するのは困難です
  • つまり、攻撃者
    • 彼の注射が有効になる数分のウィンドウしかありません
    • 推測が上手でなければなりません^^
    • ユーザーごとに異なるページを生成する必要があります。


また、ユーザーがサイトを離れた後もアクティブな状態が短いほど、ユーザーが悪いWebサイトにアクセスしたときにセッションが有効であるというリスクが少なくなることに注意してください。

しかし、ここでは、セキュリティとユーザーフレンドリーのどちらかを選択する必要があります...


別のアイデア(これは完全に安全ではありませんが、POSTリクエストを強制する方法がわからない場合に役立ちます)、人々が投票しているときにのみPOSTリクエストを受け入れることです:

  • ブラウザは挿入されたタグのGETリクエストを送信しています
  • このURLは一部のデータを変更しているため、とにかく、GETでは機能せず、POSTでのみ機能するはずです。

ただし、これは完全に安全ではないことに注意してください。Javascriptを少し使用して、POSTリクエストを強制/偽造することは(おそらく?)可能です。

于 2010-03-26T20:38:12.530 に答える
19

まず、サーバーの状態を変更するために GET リクエストを使用しないでください。そのため、投票サービスには POST/PUT をお勧めします。これはガイドラインにすぎませんが、賢い方法です。

あなたの質問に対して、CSRFはクライアントの問題であるため、使用するサーバー言語(あなたの場合はPHP)の種類は関係ありません。標準的な修正方法は同じで、次のようになります。URI/POST データにランダムな値を入れ、Cookie ヘッダーに同じ値を入れます。それらが一致する場合、CSRF がないことを確認できます。これを行う方法については、StackOverflow などで多くの情報があります。これ
幸運を!

于 2010-03-26T20:43:36.513 に答える
5

OWASP には PHP 用の CSRFGuard と、私がずっと前に XMB -> UltimaBB -> GaiaBB 用に書いた PHP 用の ESAPI があります。

http://code.google.com/p/gaiabb-olpc/source/search?q=function+get_new_token&origq=function+get_new_token&btnG=検索+トランク

他の人がそのコードをクリーンアップし、より強力なトークンを許可したようです:

https://www.owasp.org/index.php/PHP_CSRF_Guard

ありがとう、アンドリュー

于 2013-02-04T04:15:41.040 に答える