10 August 2008

PHP (PEAR Auth) でのユーザ認証 (MySQLの認証DBへの登録処理)

前回の記事「PHPでのユーザ認証」で必要となるDBへの、新規ユーザ登録やパスワード変更のための簡易的なインターフェースを実装する。 (PEARのAuthパッケージでDBを使う場合は、DB上にユーザ名とパスワードのMD5ハッシュを格納しておく必要があるため)

実際は一つのPHPファイルだが、分かりやすく登録部分と、既存ユーザの一覧表示部分を分けて記述する。

まずは、ソースコードの前半部分、ユーザ登録・パスワード変更部分


<html>
<body>

<?php

if($_POST['user'] && $_POST['password'])
{
// MySQL 接続
if (!($cn = mysql_connect("localhost:3306", "authuser", "mypass"))) {
die;
}
// MySQL DB 選択
if (!(mysql_select_db("auth_db"))) {
mysql_close($cn);
die;
}

// ユーザ名検索のためのクエリ文
$sql = sprintf("select idx,user from auth_tbl where user='%s'", mysql_real_escape_string($_POST['user']) );

if (!($rs = mysql_query($sql))) {
mysql_close($cn);
die;
}

// ユーザ名が存在するかどうかで処理の分岐:新規・パスワード更新
if(mysql_num_rows($rs) == 0)
{
// 新規登録
print("<p>ユーザ".htmlspecialchars($_POST['user'])."を新規登録します</p>");
$sql = sprintf("insert into auth_tbl (user, password) values ('%s', '%s')", mysql_real_escape_string($_POST['user']), mysql_real_escape_string(MD5($_POST['password'])) );

if (!mysql_query($sql)) {
mysql_close($cn);
die;
}
}
else
{
// パスワードアップデート
print("<p>ユーザ".htmlspecialchars($_POST['user'])."のパスワードを変更します</p>");
$sql = sprintf("update auth_tbl set password='%s' where user='%s'", mysql_real_escape_string(MD5($_POST['password'])), mysql_real_escape_string($_POST['user']) );

if (!mysql_query($sql)) {
mysql_close($cn);
die;
}
}
// MySQL 切断
mysql_close($cn);
$cn = FALSE;
}

次に登録済みユーザ一覧表示のソース


// ココから先、既存ユーザ情報の読み出し
print("<p>登録済みユーザ一覧</p>");

// MySQL 接続
if (!($cn = mysql_connect("localhost:3306", "authuser", "mypass"))) {
die;
}
// MySQL DB 選択
if (!(mysql_select_db("auth_db"))) {
mysql_close($cn);
die;
}

$sql = "select idx,user,password from auth_tbl";

if (!($rs = mysql_query($sql))) {
mysql_close($cn);
die;
}

// MySQL レコード参照開始
print("<table border=\"1\">");
print("<td>no</td><td>ユーザ</td><td>パスワード</td>\n");
while ($item = mysql_fetch_array($rs)) {
print("<tr><td>".$item['idx']."</td><td>".htmlspecialchars($item['user'])."</td><td>".$item['password']."</td></tr>\n");
}
print("</table>");

// MySQL 切断
mysql_close($cn);

?>

最後に、画面下部に表示するユーザ名とパスワードの入力フォーム


<table>
<form method="POST" action="./pear_auth_adduser.php">
<tr>
<td>ユーザ名</td><td><input type="text" name="user" size="20" maxlength="16" /></td>
</tr>
<tr>
<td>パスワード</td><td><input type="text" name="password" size="50" maxlength="128" /></td>
</tr>
<tr>
<td colspan="2"><input type="submit" value="ユーザ追加・パスワード変更" /></td>
</tr>
</form>
</table>

</body>
</html>

※ SQLインジェクション、クロスサイトスクリプティングを防ぐため、必要なところの文字出力はmysql_real_escape_string( ) や htmlspecialchars( ) を用いてエスケープしているため、ソースがさらに見にくくなっている…