[PHP-users 12495] Re: パスワード変更プログラム

長田真治 php-users@php.gr.jp
Fri, 10 Jan 2003 11:11:10 +0900


長田です。


> シャドウ化されたパスワードは、この関数で生成できました。
> RedHat7.2上で動作することを確認しています。
>
> Function make_shadow_password($password)
> {
>  $salt = substr(md5(microtime()), 0, 9);
>  return crypt($password, "$1$" . $salt);
> }


自己レスです。
上記の関数は、OS のユーザ用のパスワード暗号化関数でした。

htpasswd の場合は、以下のような関数を使えばよいと思います。

直接 exec() 関数を使用するので、ブラウザから入力されて、
シェルに渡される変数については、値のチェックを十分に行う
必要があります。


<?php
  define("HTPASSWDFILE", "/home/webmaster/auth/htshadow");
  define("HTPASSWD", "/usr/bin/htpasswd");

  // htpasswdファイルを更新する。
  function htpasswd($username, $password, $htpasswdfile=HTPASSWDFILE) {
    exec(HTPASSWD . " -b " . $htpasswdfile . " " . $username . " " .
$password, $array, $return_var);
    return $return_var;
  }

  // パスワードをhtpasswdファイルで使える形に暗号化する。
  function get_encrypt_password($password) {
    exec(HTPASSWD . " -nb " . $password, $array, $return_var);
    return $return_var;
  }

  // htpasswdファイルのユーザとパスワードの情報を連想配列にして返す。
  function parse_htpasswd_file($htpasswdfile=HTPASSWDFILE){
    $array=file($htpasswdfile);
    $hash=array();
    while(list(, $val)=each($array)) {
      list($username, $password)=explode(":", $val);
      $temp_array=array($username => $password);
      $hash=array_merge($hash, $temp_array);
    }
    return $hash;
  }

  // htpasswdファイル上にユーザのエントリがあるかどうかを調べる。
  function user_exists($username) {
    if(array_key_exists($username, parse_htpasswd_file())) {
      return true;
    } else {
      return false;
    }
  }
?>


--
長田真治
株式会社グッデイ
mailto:nagata@nospam.good-day.co.jp