PHPセキュリティ対策:Basic認証ファイルをつくる

(1/1)
パスワード処理」ではパスワードの暗号化方式を、「ディレクトリやファイルのアクセス権限」では Basic認証の方法を紹介した。じつは、Basic認証で用いられるパスワードは、 crypt  関数を使って生成することができる。
そこで今回は、 crypt  関数を使ってBasic認証用の暗号化パスワードをつくるプログラムを紹介する。

(2022年6月27日)FastCGIで正常動作しない不具合を修正
(2022年5月18日)大幅改訂,pahooInputData.php分離,PHP8対応

目次

サンプル・プログラムの実行例

PHPセキュリティ対策:パスワード処理

サンプル・プログラム

圧縮ファイルの内容
mkhtpsw.phpサンプル・プログラム本体。
pahooInputData.phpデータ入力に関わる関数群。
使い方は「PHPでGET/POSTでフォームから値を受け取る」「数値入力とバリデーション」「文字入力とバリデーション」などを参照。include_path が通ったディレクトリに配置すること。

準備

ユーザー名やパスワード長の初期値、最大値・最小値は定数で定義しておく。これらの定数は自由に変更できる。

0040: //表示幅(ピクセル)
0041: define('WIDTH', 600);
0042: 
0043: //Spinner - jQuery UI を使用するかどうか
0044: define('USESPINNER', TRUE);
0045: 
0046: //ユーザー名の初期値
0047: define('DEF_NAME', 'user');
0048: 
0049: //ユーザー名の最小長
0050: define('LEN_MIN_NAME', 4);
0051: 
0052: //ユーザー名の最大長
0053: define('LEN_MAX_NAME', 20);
0054: 
0055: //パスワード長の直値
0056: define('LEN_DEF_PSW', 8);
0057: 
0058: //パスワードの最小桁数
0059: define('LEN_MIN_PSW', 6);
0060: 
0061: //パスワードの最大桁数
0062: define('LEN_MAX_PSW', 20);

パスワードに使用する文字セットは、グローバル変数 $PSWclasses に用意する。

jQuery UIの Spinner の使い方については、「解説:Spinner - PHPで素数かどうか判定」をご覧いただきたい。
JavaScriptを使ったクリップボードへのコピーについては、「JavaScriptでクリップボードを使う」をご覧いただきたい。

0064: //パスワードに使用する文字セット定義
0065: $PSWclasses = array(
0066:     //オブジェクト名 => ラベル, 文字セット, チェックボックス
0067:     'num'    => array('数字',     '0123456789', TRUE),
0068:     'upper'  => array('英大文字', 'ABCDEFGHIJKLMNOPQRSTUVZXYZ', FALSE),
0069:     'lower'  => array('英小文字', 'abcdefghijklmnopqrstuvzxyz', TRUE),
0070:     'symbol' => array('記号',     '()%$#+-*', FALSE),
0071: );

解説:パスワードの生成

0225: /**
0226:  * パスワードを生成する
0227:  * @param   int    $len パスワードの長さ
0228:  * @param   string $str パスワードに使う文字の並び
0229:  * @return  string パスワード
0230: */
0231: function make_password($len$str) {
0232:     $l = strlen($str) - 1;
0233: 
0234:     $psw = '';
0235:     for ($i = 0; $i < $len$i++) {
0236:         $n = (int)mt_rand(0, $l);
0237:         $psw = $psw . substr($str$n, 1);            //1文字追加
0238:     }
0239: 
0240:     return $psw;
0241: }

パスワードを生成するアルゴリズムは、「PHPでパスワードを生成」と同じである。パスワードとして利用できる文字種は引数として与えるようにした。

解説:パスワードと暗号化パスワード

0394: //パスワード作成
0395: if ($errmsg == '') {
0396:     $ss = '';
0397:     foreach ($PSWclasses as $key=>$val) {
0398:         if ($val[2]) {
0399:             $ss .= $val[1];
0400:         }
0401:     }
0402:     $psw = make_password($len$ss);
0403:     //暗号化パスワード作成
0404:     $salt = make_password(2, 'abcdefghijklmnopqrstuvwxyz');     //標準DES
0405:     $crypt = $name . ':' . crypt($psw$salt);
0406: }

前述のグローバル変数 $PSWclasses から指定された文字種を変数 $ss に格納し、これをユーザー関数 make_password に渡してパスワード $pswd を生成する。

BASIC認証用の暗号化パスワードは  crypt  で作成できるのだが、暗号化アルゴリズムを基本的なDES暗号にする必要がある。これは第2引数の $salt を2桁にすることで指定できる。

参考サイト

(この項おわり)
header