php PHP で Basic 認証のパスワードを作る

2013年4月19日

Basic認証の場合、パスワードは crypt() 関数を使って簡単に生成できる。

書式: crypt(“暗号化する文字列”, “任意の2文字”);

単純にPHP ファイルに、以下のように記述して、ブラウザでプレビューできる。

echo crypt("mypassword", '1#');

また、以下のページを作成し、フォームの id (user name) と password に値を入力すると「id:password」という形式でパスワードを出力することができる。

<body>
<h1>Password Generator</h1>
<?php
$id = '';
$pass = '';
$_POST = checkInput($_POST);
if(isset($_POST['id'])) { $id = $_POST['id'];}
if(isset($_POST['pass'])) { $pass = $_POST['pass'];}
$pwd = crypt($pass, substr(crypt($id), -2));

function checkInput($var){
  if(is_array($var)){
    return array_map('checkInput', $var);
  }else{
    if(get_magic_quotes_gpc()){  //php.iniでmagic_quotes_gpcが「on」の場合の対策
      $var = stripslashes($var);
    }
    if(preg_match('/\0/', $var)){  //NULLバイト攻撃対策
      die('不正な入力です。');
    }
    if(!mb_check_encoding($var, 'UTF-8')){  //文字エンコードのチェック
      die('不正な入力です。');
    }
   
    return $var;
  }
}
?>
<!--$_SERVER['PHP_SELF']も自分自身への送信になるが、$_SERVER['PHP_SELF']をaction属性値として直接<form>タグに記述するとXSS脆弱性となるので、絶対に避ける。「""」(空)にするか、以下のようにhtmlspecialchars()関数でエスケープする。-->
<form method="post" action="<?php echo htmlspecialchars($_SERVER['PHP_SELF'], ENT_QUOTES, 'UTF-8'); ?>">
  id (user name): <input type="text" name="id" value="<?php echo htmlspecialchars($id, ENT_QUOTES, 'UTF-8'); ?>" size="50" /> <br />
  password: <input type="text" name="pass" value="<?php echo htmlspecialchars($pass, ENT_QUOTES, 'UTF-8'); ?>" size="50" /><br />
<input type="submit" value=".htpasswdパスワード" />
</form>
<p>ID(ユーザー名) と パスワード。「id:password」 <br />
<?php echo htmlspecialchars($id, ENT_QUOTES, 'UTF-8') . ':' .htmlspecialchars($pwd, ENT_QUOTES, 'UTF-8'); ?></p>
</body>

サンプル