はじめに
この記事を読めば、PHPで直接アクセスを禁止する方法が学べます。
手軽に始められるプログラミング言語として、PHPは多くのウェブサイトで使用されています。
しかし、その一方で、不正な直接アクセスによる情報漏えいやサーバーへの過負荷が問題となることもあります。
この記事では、その対策としてPHPで直接アクセスを禁止する方法を、実践的な5つの手法を交えながら解説します。
●直接アクセスとは
直接アクセスとは、URLを直接入力したり、ブックマークからアクセスしたりする方法を指します。
これが問題となるのは、例えばログインが必要なページにログインせずに直接アクセスされると、情報が不正に閲覧される可能性があるからです。
●PHPでの直接アクセス禁止の手法
ここからは、PHPを使って直接アクセスを禁止する手法を見ていきましょう。
○サンプルコード1:リファラーによる直接アクセス制限
リファラーとは、ユーザーがどのページから来たのかを示す情報のことです。
このリファラーを利用して、直接アクセスを制限する方法を見ていきましょう。
このコードでは、リファラーをチェックして、直接アクセスを禁止する処理を実現しています。
<?php
// リファラーを取得
$referer = @$_SERVER['HTTP_REFERER'];
// リファラーが存在しない場合、直接アクセスとみなしエラーメッセージを表示
if (empty($referer)) {
die('このページへの直接アクセスは禁止されています。');
}
?>
上記のコードでは、$_SERVER['HTTP_REFERER']
を使ってリファラーを取得し、リファラーが存在しない場合は直接アクセスと判断してエラーメッセージを表示しています。
○サンプルコード2:セッションを利用した直接アクセス制限
セッションを利用して、直接アクセスを制限する方法を見ていきましょう。
このコードでは、セッションを使ってアクセスの許可・不許可を管理し、直接アクセスを禁止しています。
<?php
// セッションを開始
session_start();
// セッションにアクセス許可がなければエラーメッセージを表示
if (!isset($_SESSION['allow_access'])) {
die('このページへの直接アクセスは禁止されています。');
}
// アクセス許可がある場合の処理(例:データの表示や更新)
// ...
?>
上記のコードでは、まずsession_start()
でセッションを開始し、$_SESSION['allow_access']
が存在しない場合は直接アクセスと判断し、エラーメッセージを表示しています。
○サンプルコード3:トークンを利用した直接アクセス制限
トークンを利用することで、直接アクセスを制限する方法を説明します。
このコードでは、アクセスの際にトークンを確認することで、不正なアクセスを制御します。
<?php
// セッションを開始
session_start();
// トークンがセッションに存在しない場合はトークンを生成
if (!isset($_SESSION['token'])) {
$_SESSION['token'] = bin2hex(random_bytes(32));
}
// POSTリクエストの場合
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
// POSTされたトークンとセッションのトークンが一致するかチェック
if (!hash_equals($_SESSION['token'], $_POST['token'])) {
die('不正なアクセスが検出されました。');
}
}
// フォームの送信先は自身のページ
$action = $_SERVER['PHP_SELF'];
?>
上記のコードでは、まずsession_start()
でセッションを開始し、$_SESSION['token']
が存在しない場合はトークンを生成します。
その後、POSTリクエストがあった場合には、送信されたトークンとセッションに保存されているトークンが一致するかをチェックし、一致しない場合はエラーメッセージを表示します。
○サンプルコード4:HTTPヘッダーの利用
HTTPヘッダーを利用して直接アクセスを制限する方法を説明します。
このコードでは、HTTPヘッダーの中のX-Requested-Withを確認して、Ajaxリクエストのみ許可する処理を行っています。
<?php
// X-Requested-Withヘッダーが存在しない場合はエラーメッセージを表示
if (!isset($_SERVER['HTTP_X_REQUESTED_WITH'])) {
die('このページへの直接アクセスは禁止されています。');
}
// X-Requested-WithヘッダーがXMLHttpRequestでない場合もエラーメッセージを表示
if (strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) !== 'xmlhttprequest') {
die('このページへの直接アクセスは禁止されています。');
}
?>
上記のコードでは、HTTPヘッダーのX-Requested-Withが存在しない場合、またはその値が’xmlhttprequest’でない場合には直接アクセスとみなし、エラーメッセージを表示します。
○サンプルコード5:.htaccessを利用した直接アクセス制限
.htaccessファイルを利用することで、直接アクセスを制限する方法を説明します。
この例では、特定のIPアドレスからのアクセスのみ許可する処理を行っています。
order deny,allow
deny from all
allow from 192.168.0.1
上記の.htaccessファイルの設定では、まず全てのアクセスを拒否した後で、指定したIPアドレスからのアクセスのみを許可しています。
●注意点と対処法
直接アクセス制限の方法にはいくつかの注意点があります。
まず、リファラーによる制限の場合、リファラーはユーザーエージェントによって偽装される可能性があるため、完全に信用することはできません。
また、ユーザーがブラウザの設定でリファラーを送信しないように設定している場合もあります。
セッションやトークンを利用した制限の場合、セッションやトークンの管理が不適切な場合、不正アクセスやセッションハイジャックなどのリスクがあります。
セッションやトークンは適切に管理し、特にトークンは毎回新しく生成することを推奨します。
HTTPヘッダーや.htaccessによる制限の場合、設定ミスが原因で意図しないアクセス制限がかかる可能性があります。設定を行う際は十分に注意が必要です。
まとめ
この記事では、リファラー、セッション、トークン、HTTPヘッダー、.htaccessを利用した直接アクセス制限の方法を説明しました。
それぞれの方法には特性と注意点がありますので、適切な方法を選んで利用してください。
セキュリティ対策はウェブアプリケーション開発の重要な要素の一つです。
十分な注意と理解を持って取り組みましょう。