PHPでセッションハイジャック対策を行う方法を現役エンジニアが解説【初心者向け】

初心者向けにPHPでセッションハイジャック対策を行う方法を現役エンジニアが解説しています。セッションハイジャックとは、何らかの方法でセッションが乗っ取られることです。定期的にsession_regenerate_id関数でセッションIDを変える方法を解説します。

TechAcademyマガジンはオンラインのプログラミングスクールTechAcademy [テックアカデミー]が運営する教育×テクノロジーのWebメディアです。初心者でもすぐ勉強できる記事が2,000以上あります。

今回は、PHPでファイルの存在を確認する関数の使い方について解説します。

 

なお本記事は、TechAcademyのPHP/Laravel講座の内容をもとに紹介しています。

 

田島悠介

今回は、PHPに関する内容だね!

大石ゆかり

どういう内容でしょうか?

田島悠介

PHPでファイルの存在を確認する関数の使い方について詳しく説明していくね!

大石ゆかり

お願いします!

 

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

セッションハイジャックとは、何らかの方法でセッションが乗っ取られることを指します。セッションが乗っ取られることにより、ユーザの権限を使われて不正な操作をされたり、ユーザの個人情報・重要情報が盗まれる場合があります。つまり、「なりすまし」による不正アクセスが可能になります。

ユーザはHTTPアクセス(WEBサイトを観覧したりするときの通信)によって、様々なサイトに接続します。その時、ログインをして個人に紐付いた情報を取得するときなどに、HTTPセッションというものを利用します。

通常のHTTPアクセスは状態を保持しない接続(ステートレス)ですので、このHTTPセッションを使うことで、状態を保持した接続ができるようになります。

HTTPセッションのやり取りは、セッションIDというものを使って、個人を識別します。このセッションIDが奪取されると、別のユーザがHTTPアクセスにそのセッションIDを送ることで、元のセッションIDの持ち主として接続が成立します。そのため、元のセッションIDの持ち主になりすますことが可能になります。

セッションハイジャック対策の方法

セッションハイジャックの対策には、セッションIDを奪われないようにすることが必要になります。セッションIDを奪う方法もいくつかあり、それに合わせて対策を行うのが効果的です。それでは、セッションIDを奪う方法とその対策をご紹介します。

 

セッションIDを推測される

セッションIDが単純なロジック(日付やユーザIDなど)で作成されている場合、通常の接続での自分のセッションIDから、他のセッションIDを推測することができます。そのため、総当たりでセッションIDを奪取されます。

対策としては、セッションIDを生成する際に、ユーザや日付などの特定の情報に関連しないIDを生成する、ID生成のロジックに適切な乱数生成アルゴリズムを使う、などがあげられます。

 

不正アクセスにより、セッションIDを奪取する

ユーザの接続に対して、何らかの方法で不正アクセスを行い、直接セッションIDを盗み取ります。例えば、クロスサイトスクリプティングのように、不正なサイトに誘導され、セッションIDを不正表示させるなどにより、取得されます。

対策としては、通信路の暗号化(SSL)や、エスケープ処理などのサニタイズを行うことなどがあります。

 

セッションIDが固定化される

セッションフィクセーション攻撃とも呼ばれている方法です。これは、攻撃者が特定のセッションIDを指定したURLをユーザに接続させることにより、セッションIDをその値に設定します。

これにより、攻撃者が意のままにセッションIDを設定し、そのセッションIDでユーザが接続した後に、設定したセッションIDでユーザに成り代わります。

対策としては、URLなどでセッションIDを設定できないようにすることが必要になります。

 

[PR] PHPのプログラミングで挫折しない学習方法を動画で公開中

実際に書いてみよう

それでは、実際にセッションハイジャックの対策を実装してみましょう。同じユーザの接続であっても、毎回違うセッションIDを用いてセッションを保持する方法があります。

これにより、取得されたセッションIDが、次の接続では別のセッションIDになるため、セッションIDが推測されにくくなります。

<?php
session_start();
session_regenerate_id(true);
if ( $_POST['my_name'] ) {
 $_SESSION['my_name'] = $_POST['my_name'];
}
if ( $_SESSION['my_name'] ) { ?>
ようこそ<?php echo htmlspecialchars($_SESSION['my_name']); ?>さん<br>
<?php } else { ?>
<form action="" method="post">
  <dl>
    <dt>名前</dt>
    <dd><input type="text" name="my_name" id="my_name" /></dd>
  </dl>
  <input type="submit" value="送信する" />
</form>
<?php } ?>

このように、

session_regenerate_id(true);

という関数を実行することで、同じセッションでも接続するごとに別のセッションIDが生成され使われるようになります。実際に送信されるセッションIDについては、GoogleChromeの開発者ツールなどで確認することができます。

 

筆者プロフィール

メンターYさん

フリーランスエンジニアとして、PHPを中心としたWEB開発全般を行う。最近では、WordPressを使ったメディアの構築・運用を多くこなしている。

元々は大手通信会社のエンジニアで、セキュリティに関する仕事をするも、大企業が肌に合わず独立。一箇所に縛られての仕事を苦手とし、自宅とカフェとコワーキングスペースを行ったり来たりしている。

ただ、自宅にいるとどうしてもゲームをしてしまうため、コワーキングスペースの比率が大きい。

 

大石ゆかり

内容分かりやすくて良かったです!

田島悠介

ゆかりちゃんも分からないことがあったら質問してね!

大石ゆかり

分かりました。ありがとうございます!

 

オンラインのプログラミングスクールTechAcademyではオンラインブートキャンプPHP/Laravelコースを提供しています。

PHPやフレームワークのLaravelを使ってWebアプリケーションの開発を学ぶことができます。

現役エンジニアがパーソナルメンターとして受講生に1人ずつつき、マンツーマンのメンタリングで学習をサポートし、最短4週間で習得することが可能です。

また、現役エンジニアから学べる無料のプログラミング体験会も実施しているので、ぜひ参加してみてください。