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 が通ったディレクトリに配置すること。

準備

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

  40: //表示幅(ピクセル)
  41: define('WIDTH', 600);
  42: 
  43: //Spinner - jQuery UI を使用するかどうか
  44: define('USESPINNER', TRUE);
  45: 
  46: //ユーザー名の初期値
  47: define('DEF_NAME', 'user');
  48: 
  49: //ユーザー名の最小長
  50: define('LEN_MIN_NAME', 4);
  51: 
  52: //ユーザー名の最大長
  53: define('LEN_MAX_NAME', 20);
  54: 
  55: //パスワード長の直値
  56: define('LEN_DEF_PSW', 8);
  57: 
  58: //パスワードの最小桁数
  59: define('LEN_MIN_PSW', 6);
  60: 
  61: //パスワードの最大桁数
  62: define('LEN_MAX_PSW', 20);

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

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

  64: //パスワードに使用する文字セット定義
  65: $PSWclasses = array(
  66:     //オブジェクト名 => ラベル, 文字セット, チェックボックス
  67:     'num'    => array('数字',     '0123456789', TRUE),
  68:     'upper'  => array('英大文字', 'ABCDEFGHIJKLMNOPQRSTUVZXYZ', FALSE),
  69:     'lower'  => array('英小文字', 'abcdefghijklmnopqrstuvzxyz', TRUE),
  70:     'symbol' => array('記号',     '()%$#+-*', FALSE),
  71: );

解説:パスワードの生成

 225: /**
 226:  * パスワードを生成する
 227:  * @param   int    $len パスワードの長さ
 228:  * @param   string $str パスワードに使う文字の並び
 229:  * @return  string パスワード
 230: */
 231: function make_password($len, $str) {
 232:     $l = strlen($str- 1;
 233: 
 234:     $psw = '';
 235:     for ($i = 0$i < $len$i++) {
 236:         $n = (int)mt_rand(0, $l);
 237:         $psw = $psw . substr($str, $n, 1);          //1文字追加
 238:     }
 239: 
 240:     return $psw;
 241: }

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

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

 394: //パスワード作成
 395: if ($errmsg == '') {
 396:     $ss = '';
 397:     foreach ($PSWclasses as $key=>$val) {
 398:         if ($val[2]) {
 399:             $ss .$val[1];
 400:         }
 401:     }
 402:     $psw = make_password($len, $ss);
 403:     //暗号化パスワード作成
 404:     $salt = make_password(2, 'abcdefghijklmnopqrstuvwxyz');     //標準DES
 405:     $crypt = $name . ':' . crypt($psw, $salt);
 406: }

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

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

参考サイト

(この項おわり)
header