対策
この脆弱性は、ログインの前後でセッションIDが同じであることが原因だ。そのため、最も簡単な対策はログイン前とログイン後でセッションIDを変更することだ。しかし、アプリケーションの仕様によってはログイン前に格納したセッション変数をログイン後にも使いたいために、セッションIDを変更したくない場合がある。
このような場合には、セッションIDとは別にログイン成功時に認証したことを表す秘密情報を発行する。そして、発行された秘密情報をサーバ側で記録しておき、ログイン状態の確認には、発行した秘密情報とブラウザから受け取った秘密情報が一致するかどうかで行います。
クロスサイトリクエストフォージェリ
クロスサイトリクエストフォージェリ(CSRF)は、対象のアプリケーションでセッションを維持しており、かつ他のサイトを閲覧していた時などに、そのサイト内にあるリンクをたどると、ユーザーの意図には関係なく、対象のアプリケーションでの商品の購入やパスワードの変更といった処理を勝手に行ってしまう問題だ。
たとえば、以下のような画面遷移を行うアプリケーションがあるとする。
ログインしている(セッションを維持している)状態では既に「画面A→画面B」のリクエストaが送信される。この状態で、ユーザーが別のサイトを閲覧する。このときに別サイトにあるリンクをクリックするなどにより、リクエストdを送信すると(ログインしている状態であるため)リクエストdで実行される処理をユーザーが意図せず実行してしまう。その結果、パスワードが変更されたり、商品が購入されるという被害が発生する。