これは、次の場合に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リクエストを強制/偽造することは(おそらく?)可能です。