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

サンプル・プログラムのダウンロード
passwordStrength.php | サンプル・プログラム本体 |
pahooInputData.php | データ入力に関わる関数群。 使い方は「数値入力とバリデーション」「文字入力とバリデーション」などを参照。include_path が通ったディレクトリに配置すること。 |
バージョン | 更新日 | 内容 |
---|---|---|
1.2.1 | 2023/03/09 | bug-fix |
1.2.0 | 2023/02/25 | 判定方法変更,リファラチェック改良 |
1.1.0 | 2023/02/05 | pahooInputDataクラス導入 |
1.0.0 | 2020/02/01 | 初版 |
バージョン | 更新日 | 内容 |
---|---|---|
1.1.2 | 2023/02/05 | validString() 修正 |
1.11 | 2022/07/03 | isCommandLine() 修正 |
1.1 | 2022/06/04 | getValidString() 修正 |
1.0 | 2022/05/18 | 初版 |
パスワードの強度
- 数字だけ
- 英数6文字以下
- Wikipediaの見出しに存在する
- 記号が含まれていない
- 記号が含まれている
解説:文字列の長さ
ここで、PASSWORD_LENGTH_MINを8、PASSWORD_LENGTH_MAXを64としたのは、NIST(National Institute of Standards and Technology;米国立標準技術研究所)のセキュリティ文書「NIST Special Publication 800-63B」の「5.1.1 記憶シークレット」を引用している。
解説:数字だけ
 147: /**
 148: * 指定した文字列が数字だけかどうかを求める.
 149: * @param string $str 文字列
 150: * @return bool TRUE:数字だけである/FALSE:ではない
 151: */
 152: function isNumber($str) {
 153: return preg_match('/^[0-9]+$/ui', $str) ? TRUE : FALSE;
 154: }
解説:英数字だけ
 156: /**
 157: * 指定した文字列が英数字だけかどうかを求める.
 158: * @param string $str 文字列
 159: * @return bool TRUE:英数6文字以下である/FALSE:ではない
 160: */
 161: function isAlphanumeric($str) {
 162: return preg_match('/^[A-Z|a-z|0-9]$/ui', $str) ? TRUE : FALSE;
 163: }
解説:Wikipediaの見出しに存在する
文字列からWikipediaの見出しURLを生成し、「PHPでリンク切れを調べる」で作ったユーザー関数 getHttpResponseCodeSize を使って存在するかどうか判定する。
 218: /**
 219: * Wikipediaの見出しに存在する文字列かどうか
 220: * @param string $str 文字列
 221: * @return bool TRUE:存在する/FALSE:しない
 222: */
 223: function isWikipedia($str) {
 224: $str = urlencode($str);
 225: $url = 'https://en.wikipedia.org/wiki/' . $str;
 226: list($code, $size) = getHttpResponseCodeSize($url);
 227:
 228: return ($code == 200) ? TRUE : FALSE;
 229: }
解説:記号を含まない
 231: /**
 232: * 指定した文字列が記号を含まないかどうかを求める.
 233: * @param string $str 文字列
 234: * @return bool TRUE:記号が含まれていない/FALSE:含まれている
 235: */
 236: function isContainNoSymbol($str) {
 237: return preg_match('/^[a-z|0-9]+$/ui', $str) ? TRUE : FALSE;
 238: }
解説:パスワードの強度を算出
 240: /**
 241: * パスワードの強度を算出
 242: * @param string $psw パスワード
 243: * @return int 強度
 244: * 1:数字だけ
 245: * 2:英数字のみ
 246: * 3:Wikipediaの見出しに存在する
 247: * 4:記号が含まれていない
 248: * 5:記号が含まれている
 249: */
 250: function getPasswordStrength($psw) {
 251: //強度と判定関数の対応表
 252: $table = array(
 253: 0 => 'validateLength',
 254: 1 => 'isNumber',
 255: 2 => 'isAlphanumeric',
 256: 3 => 'isWikipedia',
 257: 4 => 'isContainNoSymbol'
 258: );
 259:
 260: //入力値(パスワード)の検査
 261: $str = preg_replace('/[ \t]+/ui', '', $psw); //空白を除く
 262:
 263: //パスワード強度判定
 264: $res = 5;
 265: foreach ($table as $key=>$func) {
 266: if ($func($str)) {
 267: $res = $key;
 268: break;
 269: }
 270: }
 271: return $res;
 272: }
参考サイト
- PHPでパスワードを生成:ぱふぅ家のホームページ
- 強いパスワードをつくる:ぱふぅ家のホームページ
- PHPセキュリティ対策:パスワードとcrypt関数:ぱふぅ家のホームページ
- PHPでリンク切れを調べる:ぱふぅ家のホームページ
今回は、文字の種類や長さのほか、既存単語かどうか、パスワードの強度を調べるPHPプログラムを作ってみることにする。なお、入力したパスワードをデータベースやファイル、キャッシュに蓄えることはしないが、ネット越しにパスワードが行き来するので、万が一のことを考え、ここで検査したパスワードを本番認証には使わないようにしてほしい。
(2023年3月9日)不具合修正
(2023年2月25日)判定方法変更,リファラチェック改良
(2023年2月5日)pahooInputDataクラス導入