PHPとベーシック認証で手軽にアクセス制限付きのサイトを制作

  • 投稿日:
  • by ライブラリ編集局

PHPと.htaccessを利用したベーシック認証で手軽にアクセス制限付きのサイトを制作する方法
一般的にWebサイトのコンテンツ制作者がWebサイト内で会員専用のファイル閲覧やダウンロードなどといった、特定のディレクトリにアクセス制限をかけた仕組みを利用したい場合、いろんな方法が考えられます。
今回は、Webサーバの専門的な知識をそれほど必要とせず、かつCMSの機能に依存しないで会員専用サイトを実現する方法をご紹介します。

【Webサイトへのアクセスを制限する方法】
1. .htaccessと.htpasswdでベーシック認証
2. .htaccessでIPアドレスによるアクセス制限
2. PHPでサーバセッションを利用する

この他にもWebサーバ側で制限する方法やCMSの機能を利用する方法もありますが、今回は省略します。


このうち、ベーシック認証とはHTTP認証方式の中で最も一般的に普及している基本認証と呼ばれるアクセス制限方法で、どのWebサーバもWebブラウザも対応しています。
利用しているWebサーバ側で.htaccessの設置許可があれば、FTP接続で簡単に設置できるものです。
ただ、セキュリティ面から見るとユーザ名とパスワードが暗号化やハッシュ化がさないプレーンテキストの状態で送受信されるため、簡単に盗聴・改ざんされてしまう恐れがあります。
利用する際は、あくまでアクセス制限方法の中でも簡易方式だと理解した上で、個人が特定される情報や企業の秘密情報、DB接続情報などは決して保存しないように心掛ける必要があります。

それでは、実際の構築例を元に概要を解説します。
まず、下の図はサーバにFTPで接続した際のディレクトリ構成です。

ftp_dir.png

全体としてのポイントは、
1.会員専用ディレクトリの直下にはベーシック認証は設置しない。
2.代わりに「index.php」でログインチェックとHTTP認証を行う
3.会員専用ディレクトリ内にダウンロード用のデータや画像参照用データなど、
 別途ディレクトリを設けて個別に「.htaccess」を設置
 ※これで、URL直打ちでのダウンロードを防ぐ
4.各ディレクトリに設置する「.htaccess」の記述は同一
 ※共通して「cgi-bin」の「.htpasswd」を参照する
5.会員の増減に伴い、都度データベースの情報を更新すると同時に、「.htpasswd」ファイルへの書き出し更新も行う
6..ログインチェックはDB内のID/Passと直接照合するが、ベーシック認証側では「cgi-bin」に書き出された「.htpasswd」を参照してHTTP認証を行う。

例として、「httpdocs」「cgi-bin」などのディレクトリ名を使用していますが、ご自分の環境により読み替えてください。「httpdocs」はWeb公開領域、「cgi-bin」は外部からの接続ができない非公開領域が望ましいのですが、非公開領域が設けられていない場合や、その領域に更新管理用PHPプログラムを設置する場合などは、そのディレクトリに別途「.htaccess」でIPアドレスによるアクセス制限をかけることが必要です。


●会員専用ディレクトリの直下に設置するindex.phpの作成ポイント

HTTP認証をPHPで行う場合、一般的には、header関数を用いて以下の様な記述を行います。

header('WWW-Authenticate: Basic realm="For members"');
header('HTTP/1.0 401 Unauthorized');

ここで、ポイントとなるのが、【realm="For Members"】の箇所
「For Members」は半角英数であればOKですが、すべての「.htaccess」に記載する
「Authname "For Members"」に合わせる必要があります。
これは、アクセスしたユーザが利用するブラウザが、HTTP認証の際、
realmで指定された名称とID/Passをセットで保持するために、同一でなければなりせん。


●「.htaccess」の作成ポイント

#==============================
#.htaccess記述列 その1
#ベーシック認証

order allow,deny
allow from all
Authname "For Members"
Authtype Basic
AuthUserFile /var/xxxx/xxx/cgi-bin/.htpasswd
require valid-user


#==============================
#.htaccess記述列 その2
#IPアドレスによるアクセス制限

order deny,allow
deny from all
allow from xxx.xxx.xxx.xxx


上記で述べたように、ベーシック認証の場合、Authnameは
PHPに記述する「realm」に合わせてください。

また、AuthUserFileの「.htpasswd」のパスは各自の環境に合わせる必要があります。
もちろん、ベーシック認証とIPアドレスによるアクセス制限は、併用することが可能ですが、
運用方法をしっかり定めていないと、ユーザがアクセスできないなど、不具合が発生するので
要注意です。

なお、本記載に基づき行った作業において発生した損害にはいかなる責務も負いません。あらかじめご了承ください。