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

NAKAMURA Takeshi php-users@php.gr.jp
Sat, 11 Jan 2003 05:00:21 +0900


仲村です

From: NAKAMURA Takeshi <1yen@sh.rim.or.jp>
Date: Thu, 09 Jan 2003 19:47:15 +0900
Subject: [PHP-users 12492] Re: パスワード変更プログラム

> # そのうちやりたいと思いつつ、全然調べてなかったんですが(^^;
 と、言っていたのでやってみました。コマンドラインから変更するときは
htpasswd ではなく dbmmanage で行うようになっています。

 一番面倒だったのは FreeBSD の ports を使って dba を組み込むこと。
11時前から始めて、phpが出来上がったのは 20時。
db3 のヘッダの在処を指定するのを忘れて...P133 なマシンでは辛い(笑)
 その後 apache の dbmmanage ではまり...以下略

・以下の、/ど/こ/か は全て同じ所を指します。
・apache のデフォルトで .ht から始まるファイルは外部から見られないように
  なっている為、.htpasswd というファイル名は変更しない方がいいでしょう。

○ httpd.conf(apache 1.3.x) は、こんな風にかいてます
LoadModule db_auth_module     libexec/apache/mod_auth_db.so
AddModule mod_auth_db.c
<Directory "/ど/こ/か">
   AuthType Basic
   AuthName "Auth Auth Auth"
   AuthDBUserFile /ど/こ/か/.htpasswd.db
   Require user nakamura
</Directory>

○ chpasswd.php
<?php
# Apache Basic認証用 パスワード変更スクリプト
#
# このスクリプトは apache の dbmmanage と共生できます
# ただし、db の形式は ndbm となりますので dbmmanageで
# ndbm を優先して作らせるために dbmmanage 69行目あたりを
# BEGIN { @AnyDBM_File::ISA = qw(NDBM_File GDBM_File SDBM_File DB_File)}
# と、書き換えないと動作しないかもしれません。
#
#
# このスクリプトは login しているユーザを確認する必要があるため
# 認証の内側に置いておくこと
#
# NAKAMURA Takeshi <1yen@sh.rim.or.jp>
#
# HTPASSWDFILE: 実際のファイル名から拡張子 .db を外してください。
# SUPERUSER:    ここにかかれているユーザは、他人のパスワードを
#               変更することが可能
#
define("HTPASSWDFILE", "/home/ossan/public_html/mokushi/.htpasswd");
define("SUPERUSER",		 "AdMiN");

if (!function_exists('dba_open')) {
	echo "Error: <br>\n",
	"&nbsp;&nbsp;このphpは DBA関数が使用できるように",
	"コンパイルされていません<br><br>\n",
	'<a href="http://jp2.php.net/manual/ja/install.configure.php#install.configure.options.databases"',
	">configureスクリプトのオプション</a>を参考に dba で",
	"ndbm が扱えるようにコンパイルしなおしてください。<br>\n",
	'dba関数については<a href="http://jp2.php.net/manual/ja/ref.dba.php">',
	"dba関数について</a>を御覧ください。<br>\n";
	exit;
}

function chenge_password ($uname, $pass, $db_handle){
	# 本人 or SuperUser でloginしている場合のみ変更可能
	if ($_SERVER["PHP_AUTH_USER"] != $uname and
			$_SERVER["PHP_AUTH_USER"] != SUPERUSER){
		echo "$uname のパスワードを変更する権限がありません<br>\n";
	}

	# パスワードの sha1 ハッシュ化
	# sha1関数がある場合(php 4.3.0 以降)は sha1 でハッシュ化
	# mhash関数がある場合は、mhash関数にて sha1 でハッシュ化
	# いずれも無い場合は、md5にてハッシュ化
	if (function_exists('sha1')) {
		$pass = "{SHA}" . base64_encode(sha1($pass));
	}else{
		if (function_exists('mhash')){
			$pass = "{SHA}" . base64_encode(mhash(MHASH_SHA1, $pass));
		}else{
			# $1$ のままでも認証は通るようなので $apr1$ へ変換はあきらめる
			$salt = substr(md5(microtime()), 0, 9);
			$pass = crypt($pass, '$1$' . $salt);
		}
	}

	# DBへ更新
	if(dba_replace($uname, $pass, $db_handle)){
		echo "パスワードの更新が完了しました<br>\n",
				"新しいパスワードで login しなおしてください<br>\n";
	}else{
		echo "パスワードの更新に失敗しました<br>\n",
		"再度、試すか管理者へ連絡してください。<br>\n";
	}
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html lang="ja-JP">
	<head>
	<meta http-equiv="Content-Type" content="text/html; charset=euc-jp">
	<title>パスワードの変更</title>
	</head>
	<body>
	<form method="post">
		&nbsp; ユ ー ザ 名 &nbsp; : <input type="text" name="uname"><br>
		&nbsp;パ ス ワ ー ド : <input type="password" name="pass"><br>
		確認のため再入力: <input type="password" name="pass2"><br>
		<input type=submit value="変更">
	</form>
<?php
	# パスワードが入力されていないときは何も実行しない
	if ($_POST['uname'] == "" or $_POST['pass'] == "") exit;

	$umame = $_POST['uname'];
	$pass  = $_POST['pass'];
	$pass2 = $_POST['pass2'];

	if ($pass != $pass2)	die("パスワードが合いません<br>\n再度入力ください<br>\n");

	$db_handle = dba_open (HTPASSWDFILE, "n", "ndbm");
	chenge_password($uname, $pass, $db_handle);
	dba_close ($db_handle);
?>
	</body>
</html>
=========8<========8<========8<========8<========8<========8<========8<====
 関西沖縄青年の集い がじまるの会 手伝い 一人だけの勝手に神奈川支部
 仲村 武 <1yen@sh.rim.or.jp>
# 変なところがあったら、突っ込んでやって下さい。