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( ) を用いてエスケープしているため、ソースがさらに見にくくなっている…