PHPでログイン機能を構築する際、セッションハイジャックという攻撃への対策を検討しなければならない。

ここではPHPで一般的に使われる最も簡単な対策の一つを紹介する。

まずは結論から

PHPで用意されている豊富な関数の中には、セッションハイジャックに対し有効な関数も用意されており、以下の1行を記述することで簡単に対策を実装することができる。

session_regenerate_id(true);

session_regenerate_id関数は、セッションIDを新しく振り直す関数で、引数にtrueを与えることで関連する古いセッション情報も合わせて削除することができる。

具体的な使い方

よくあるパスワード認証のログインフォームの場合を例に挙げる。

if(password_verify($password, $hashPass)) {
  session_regenerate_id(true);

  // 以下ログイン後の処理
  // ...
}

パスワード認証が通った際にsession_regenerate_id関数を使ってセッションIDを振り直すことで、ログイン前のセッションIDを攻撃者に盗難されていた場合における有効な対策となる。

そもそもセッションハイジャックとは

セッションハイジャックは文字通り、ユーザーのセッションIDをなんらかの方法で盗むことで、なりすましや乗っ取り行為を行うサイバー攻撃の一つだ。

セッションハイジャックの中でも、セッションIDの固定化と言われる攻撃例を挙げよう。

まず攻撃者がWebサイトに訪れた際に発行されるセッションIDを取得し、なんらかの方法でユーザーに送り込む。

送り込まれたユーザーは、攻撃者と同じセッションIDを利用しWebサイトを閲覧する。

この時、もしユーザーがWebサイトのマイページなどへログインした場合、攻撃者は自分が送り込んだセッションIDを利用してユーザーのマイページにアクセスすることができるようになり、乗っ取り完了となってしまう。

しかし、ここで紹介したsession_regenerate_id関数を使ってログイン後にセッションIDを再生成することで、上述の攻撃を防ぐことができるというわけだ。

金融や個人情報が絡むサイトで、セッションハイジャックによる乗っ取り行為が起きた際の被害は甚大なものになるので、認証機能を自作する際はセキュリティに神経をすり減らし、制作をおこなわなければならない。