icon
icon

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

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

テックアカデミーマガジンは受講者数No.1のプログラミングスクール「テックアカデミー」が運営。初心者向けにプロが解説した記事を公開中。現役エンジニアの方はこちらをご覧ください。 ※ アンケートモニター提供元:GMOリサーチ株式会社 調査期間:2021年8月12日~8月16日  調査対象:2020年8月以降にプログラミングスクールを受講した18~80歳の男女1,000名  調査手法:インターネット調査

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

 

そもそもPHPについてよく分からないという方は、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を使ってWebアプリケーション開発を習得できるオンラインブートキャンプPHP/Laravel講座を開催しています。

挫折しない学習方法を知れる説明動画や、現役エンジニアとのビデオ通話とチャットサポート、学習用カリキュラムを体験できる無料体験も実施しているので、ぜひ参加してみてください。

初心者・未経験でもできる。まずはテックアカデミーに相談しよう

プログラミングを独学で学習していて、このように感じた経験はないでしょうか?

  • ・調べてもほしい情報が見つからない
  • ・独学のスキルが実際の業務で通用するのか不安
  • ・目標への学習プランがわからず、迷子になりそう

テックアカデミーでは、このような 学習に不安を抱えている方へ、マンツーマンで相談できる機会を無料で提供 しています。
30分間、オンラインでどんなことでも質問し放題です。

「受けてよかった」と感じていただけるよう カウンセラーやエンジニア・デザイナー があなたの相談に真摯に向き合います。

「自分に合っているか診断してほしい」
「漠然としているが話を聞いてみたい」

こんなささいな悩みでも大丈夫です。

無理な勧誘は一切ありません ので、まずはお気軽にご参加ください。
※体験用のカリキュラムも無料で配布いたします。(1週間限定)

今なら参加者限定の割引特典付き! 無料相談を予約する