« JavaScriptでGETを取得する | トップページ | 住所を都道府県・市区郡・それ以下に分けてみよう »

2007年03月10日

PHPでBasic認証のパスワードを作ってみよう

認証と言えば、Basic認証。
.htaccessと.htpasswdを設置するだけで認証をかけられる手軽さが最大のメリットです。
多分、この記事を見てる方も使ったことのない方はいないのではないでしょうか?
セキュリティは高くないものの「関係者以外に見られても構わないけどURL叩くだけで表示されるのはちょっと。。。」という場合に多く使用します。
今はレンタルサーバーで管理画面などから設置できることがほとんどですが、管理画面から設置できなかったり設置数に制限があったりすることもあります。
そこで自分で作って設置するのですが、Basic認証(.htaccess)を設置するには.htaccessにパスワードの設置場所をサーバのルートパスから位置を記述したり、パスワードを自分で作る必要があります。
今回はそんなときに役立つPHPの関数を紹介します。

[追記 2007/03/11]
Basic認証作成プログラムを作りました。htaccessを丸ごと作ったりパスワードだけを作ったりするBasic認証作成の支援プログラムです。ご自由にお使いください。
Basic認証作成プログラム

まずは本題のPHPでパスワードを作る方法です。
Basic認証のパスワードは以下のような記述になります。

staff:mlAVmSW3gMmpk

「:(コロン)」でアカウントとパスワードが分かれています。
この場合は「staff」がアカウントになります。
パスワードの作り方は非常に簡単でcrypt()関数を使うだけです。
以下のスクリプトを記述してブラウザでプレビューすれば暗号化してくれます。
echo crypt("password", 'mc');

crypt関数のリファレンスは以下の通り
string crypt ( string str, string [salt] )
crypt("暗号化する文字列", "任意の2文字");

saltを指定しなかった場合、デフォルトではMD5で暗号化を行います。Basic認証のパスワードはDES暗号なので第二引数には半角英数記号で2文字記述します。
echo crypt("password", '1a');

と記述しても
echo crypt("password", 'zr');

と記述してもどちらでも認証可能です。
で、生成した文字列をコピーして「アカウント:パスワード」と記述すればBasic認証のパスワードが簡単に作れます。

次はサーバパスの調査方法です。
以下のようにphpinfo()を設置してブラウザで表示します。
phpinfo()の中に「DOCUMENT_ROOT」という部分があるのですが、それがドキュメントルートのサーバパスになります。

phpinfo();

phpinfo()が使えなかったりphpinfo()の中にパスを確認できなかった場合、以下のスクリプトで確認する方法もあります。
echo $_SERVER['DOCUMENT_ROOT'];
echo __FILE__; // 現在のファイルのパス

ドキュメントルートが「/home/www」でパスワードのファイル名が「.htpasswd」で「site」ディレクトリに認証をかけたい場合、.htaccessには「/home/www/site/.htpasswd」と記述します。

最後に、Basic認証の設置方法を簡単に紹介します。
最初に「.htaccess」というファイルを作ります。Windowsの場合、「.(ドット)」から始まるファイルは作れませんので、「htaccess.txt」など別の名前を仮に付けておきます。
「.htaccess」をテキストエディタで開いて

AuthUserFile /home/www/site/.htpasswd
AuthGroupFile /dev/null
AuthName "STAFF PAGE"
AuthType Basic
require valid-user

赤テキスト部分以外は毎回固定です。
/home/www/site/.htpasswdの部分にはパスワードを設置するファイルパスを記述します。(サイトのドキュメントルートからのパスではなく、サーバのパスですのでご注意ください)
STAFF PAGEの部分には認証の際にダイアログに表示されるテキストを記述します。日本語でも大丈夫ですが、文字化けの可能性が高いので使わないほうがいいでしょう。
今回は「/home/www/site」ディレクトリの中の「.htpasswd」ファイルにパスワードが設置されていると仮定しています。
次に「.htpasswd」を作ります。「.htaccess」と同じようにWindowsでは「.(ドット)」から始まるファイルは作れませんので、「htpasswd.txt」など別の名前を仮に付けておきます。
staff:mlAVmSW3gMmpk

アカウントを複数作る場合は以下のように1行につき1アカウント作ります。
staff:mlAVmSW3gMmpk
s-memo:mcguYfwbSHFR2

これで準備完了です。後はFTPで認証を掛けたいディレクトリに「.htaccess」を/home/www/siteに「.htpasswd」を設置します。名前を変えて作っていた場合はファイル名を「htaccess.txt」を「.htaccess」に「htpasswd.txt」を「.htpasswd」に変更します。
「.htaccess」の名前は固定ですが(ただしApacheの設定で変更可能)、「.htpasswd」は「.password」など自由にファイル名前をつけられます。
FTPでアップロードする場合、両方とも「アスキー」モードでアップロードしてください。

と、気が付けばPHPのことよりBasic認証の設置方法のほうがスペース食っちゃった。。。
最近は何か基本的な技術紹介が多いのですが、メモ書きとして残しておこうかと考えました。
たまーにしか使用せず記述方法をよく忘れますので、、、(´Д`)

トラックバック

このエントリーのトラックバックURL:
http://www.s-memo.net/mt/mt-tb.cgi/34

コメントを投稿

(いままで、ここでコメントしたことがないときは、コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。)