ホームページ > php教程 > php手册 > PHP でユーザー ID 認証を実装する 2 つの方法

PHP でユーザー ID 認証を実装する 2 つの方法

WBOY
リリース: 2016-06-21 08:57:30
オリジナル
1194 人が閲覧しました

サイトを設計および保守する場合、ユーザーは多くの場合、特定の重要なファイルまたは情報へのアクセスを制限する必要があります。通常、Web の HTTP プロトコルに組み込まれているユーザー認証メカニズムを使用できます。訪問者が保護されたページを閲覧すると、クライアント ブラウザはダイアログ ウィンドウをポップアップ表示し、ユーザー名とパスワードを入力してユーザーの身元を確認し、ユーザーがページにアクセスする権利があるかどうかを判断するように求めます。その実装原理を説明するために 2 つの方法が使用されます。

1. HTTP ヘッダーを使用して

を実現します。

ヘッダーは、HTTP プロトコルを使用して HTML 情報をブラウザーに送信する前にサーバーによって送信される文字列です。 HTTP は、チャレンジ/レスポンス モデルを使用して、パスワードで保護された領域に入ろうとするユーザーを認証します。具体的には、ユーザーが初めて保護領域にアクセスするリクエストを Web サーバーに送信すると、チャレンジ プロセスが開始され、サーバーはユーザーの ID が検証されていないことを示す特別な 401 ヘッダーを返します。上記の応答を検出すると、クライアント ブラウザはユーザー名とパスワードの入力を求めるダイアログ ボックスを自動的に表示します。ユーザーが入力を完了して「OK」をクリックすると、ユーザーの識別情報が検​​証のためにサーバーに送信されます。ユーザーが入力したユーザー名とパスワードが有効な場合、WEB サーバーはユーザーが保護領域に入るのを許可し、アクセス プロセス全体を通じてユーザーの ID の有効性を維持します。逆に、ユーザーが入力したユーザー名またはパスワードが検証できない場合、クライアントのブラウザは入力ウィンドウを継続的にポップアップ表示し、ユーザーに正しい情報を再度入力するよう求めます。ユーザーが正しい情報の場所を入力するまで、プロセス全体が続行されます。これを超えると、ユーザーのアクセス要求は自動的に拒否されます。

PHP スクリプトでは、関数 header() を使用して HTTP ヘッダーをクライアントのブラウザに直接送信します。これにより、ユーザー名とパスワードの入力ウィンドウがクライアント上に自動的にポップアップ表示され、ID 認証機能が実装されます。 PHP では、クライアント ユーザーが入力した情報は、サーバーに送信された後、3 つのグローバル変数 $PHP_AUTH_USER、$PHP_AUTH_PW、および $PHP_AUTH_TYPE に自動的に保存されます。これら 3 つの変数を使用すると、データ ファイルまたはデータベースに保存されているユーザー アカウント情報に基づいてユーザーの身元を確認できます。

ただし、3 つの変数 $PHP_AUTH_USER、$PHP_AUTH_PW、および $PHP_AUTH_TYPE は、モジュールとしてインストールされた PHP でのみ使用できることに注意してください。ユーザーが PHP を CGI モードで使用している場合、検証機能は実装できません。 PHP のモジュールのインストール方法はこのセクションの最後に添付されています。

以下では、MySQL データベースを使用してユーザーの ID を保存します。各アカウントのユーザー名とパスワードをデータベースから抽出し、$PHP_AUTH_USER 変数と $PHP_AUTH_PW 変数と比較してユーザーの信頼性を判断する必要があります。

まず、MySQL にユーザー情報を保存するデータベースを作成します

データベース名は XinXiKu、テーブル名は user です。テーブル定義は次のとおりです。

以下为引用的内容:

create table user(

ID INT(4) NOT NULL AUTO_INCREMENT,

name VARCHAR(8) NOT NULL,

password CHAR(8) NOT NULL,

PRIMARY KEY(ID)

)

以下は引用内容です:

テーブルユーザーの作成(

ID INT(4) NOT NULL AUTO_INCREMENT、

名前 VARCHAR(8) NOT NULL、

パスワード CHAR(8) NOT NULL、

主キー(ID)

)

以下为引用的内容:

﹤?PHP//判断用户名是否设置

if(!isset($PHP_AUTH_USER)) {

header("WWW-Authenticate:Basic realm="身份验证功能"");

header("HTTP/1.0 401 Unauthorized");

echo "身份验证失败,您无权共享网络资源!";

exit();

}

/*连接数据库*/

$db=mysql_connect("localhost","root","");

//选择数据库

mysql_select_db("XinXiKu",$db);

//查询用户是否存在

$result=mysql_query("SELECT * FROM user where name='$PHP_AUTH_USER' and password='$PHP_AUTH_PW'",$db);

if ($myrow = mysql_fetch_row($result)) {

//以下为身份验证成功后的相关操作
...

} else {

//身份验证不成功,提示用户重新输入

header("WWW-Authenticate:Basic realm="身份验证功能"");

header("HTTP/1.0 401 Unauthorized");

echo "身份验证失败,您无权共享网络资源!";

exit();

}

?>

説明: 1. ID はゼロではなく、自動的に増加するシリアル番号です。 2. name はユーザー名であり、空にすることはできません。 3. パスワードはユーザーのパスワードであり、空にすることはできません。 以下はユーザー認証ファイルlogin.phpです
以下は引用内容です: ﹤?PHP//ユーザー名が設定されているかどうかを判断します if(!isset($PHP_AUTH_USER)) { header("WWW-Authenticate:Basic realm="認証関数""); header("HTTP/1.0 401 Unauthorized"); echo "認証に失敗しました。ネットワーク リソースを共有する権限がありません!"; 終了(); } /*データベースに接続*/ $db=mysql_connect("localhost","root",""); //データベースを選択 mysql_select_db("XinXiKu",$db); //ユーザーが存在するかどうかを確認します $result=mysql_query("SELECT * FROM user where name='$PHP_AUTH_USER' およびpassword='$PHP_AUTH_PW'",$db); if ($myrow = mysql_fetch_row($result)) { //以下は本人確認が成功した後の関連操作です
... } else { // ID 検証が失敗したため、ユーザーに再入力を求める header("WWW-Authenticate:Basic realm="認証関数""); header("HTTP/1.0 401 Unauthorized"); echo "認証に失敗しました。ネットワーク リソースを共有する権限がありません!"; 終了(); } ?>

プログラムの説明:

プログラムでは、まず変数 $PHP_AUTH_USER が設定されているかどうかを確認します。設定されていない場合、スクリプトは HTTP 401 エラー番号ヘッダーを送信して、クライアントのブラウザに認証ウィンドウが表示され、ユーザー名と入力を求められます。入力が完了すると、接続データベースはユーザー名とパスワードが正しいかどうかを照会し、正しい場合はログインによる関連操作の実行を許可します。

機能の説明:

1. isset(): 変数に値が割り当てられているかどうかを判断するために使用されます。変数値が存在するかどうかに応じて、true または false を返します

2. header(): 特定の HTTP ヘッダーの送信に使用されます。 header() 関数を使用する場合は、実際の出力を生成する HTML または PHP コードの前に必ずこの関数を呼び出してください。

3. mysql_connect(): MySQL サーバー接続を開きます。

4. mysql_db_query(): クエリ文字列 (クエリ) を MySQL データベースに送信します。

5. mysql_fetch_row(): 単一の列の各フィールドを返します。

2. セッションを使用してサーバー検証を実装します

認証が必要なページの場合は、Apache サーバー認証を使用するのが最適です。ただし、Apache サーバー検証のインターフェイスは十分に使いやすいものではありません。また、CGI モードの PHP および IIS 下の PHP では、Apache サーバー検証を使用できません。このようにして、Session を使用して異なるページ間でユーザーの ID を保存し、ID 検証を行うことができます。

バックエンドでは、上記の MySQL データベースを使用してユーザー情報を保存します。

最初にユーザー ログイン インターフェイスを作成します。ファイル名はlogin.php、コードは次のとおりです:

以下为引用的内容:

﹤form action="login1.php"﹥

用户名:﹤input type="text" name="name"﹥﹤br﹥

口 令:﹤input type="text" name="pass"﹥﹤br﹥

﹤input type="submit" value="登录"﹥

﹤/form﹥
 
login1.php处理提交的表单,代码如下:

﹤?PHP

$db=mysql_connect("localhost","root","");

mysql_select_db("XinXiKu",$db);

$result=mysql_query("SELECT * FROM user where name='$name' and password='$pass'",$db);

if ($myrow = mysql_fetch_row($result)) {

//注册用户

session_start();

session_register("user");

$user=$myrow["user"];

// 身份验证成功,进行相关操作

...

} else {

echo"身份验证失败,您无权共享网络资源!";

}

?﹥

这里需要说明的是,用户可以使用在后续的操作中用**http://domainname/next.php?user=用户名 **来绕过身份验证。所以,后续的操作应先检查变量是否注册:已注册,则进行相应操作,否则视为非法登录。相关代码如下:

﹤?PHP

session_start();

if (!session_is_registered("user")){

echo "身份验证失败,属于非法登录!";

} else {

//成功登录进行相关操作
...

}

?﹥

以下は引用内容です:

﹤フォームアクション="login1.php"﹥

ユーザー名:﹤input type="text" name="name"﹥﹤br﹥

パスワード:﹤input type="text" name="pass"﹥﹤br﹥

﹤input type="submit" value="ログイン"﹥

﹤/form﹥

login1.php は送信されたフォームを処理します。コードは次のとおりです:

﹤?PHP

$db=mysql_connect("localhost","root","");

mysql_select_db("XinXiKu",$db);

$result=mysql_query("SELECT * FROM user where name='$name' およびpassword='$pass'",$db);

if ($myrow = mysql_fetch_row($result)) {

//登録ユーザー

以下为引用的内容:

ScripAlias/php4/ "C:/php4/"

AddType application/x-httpd-php4.php

AddType application/x-httpd-php4.php3

AddType application/x-httpd-php4.php4

Action application/x-httpd-php4/php4/php.exe

session_start(); session_register("ユーザー"); $user=$myrow["user"]; // ID 検証が成功しました。関連する操作を実行します ... } else { echo "認証に失敗しました。ネットワーク リソースを共有する権限がありません!"; } ?﹥ ここで、ユーザーは後続の操作で **http://domainname/next.php?user=username ** を使用して認証をバイパスできることに注意してください。したがって、以降の操作では、まず変数が登録されているかどうかを確認する必要があります。登録されている場合は、対応する操作を実行します。登録されていない場合は、不正ログインとみなされます。関連するコードは次のとおりです: ﹤?PHP session_start(); if (!session_is_registered("user")){ echo "認証に失敗しました。不正なログインです!"; } else { //関連する操作を実行するために正常にログインしました
... } ?﹥
付録: PHP をモジュールとしてインストールする方法 1. まず、ファイル mod_php4-4.0.1-pl2 をダウンロードします。 [PHP4 ではない場合は、できるだけ早くアップグレードしてください!] 解凍すると、mod_php4.dll、mod_php4.conf、readme.txt の 3 つのファイルがあります 2. 関連ファイルをコピーします mod_php4.dll を Apache インストール ディレクトリのモジュール ディレクトリにコピーします mod_php4.conf を Apache インストール ディレクトリの conf ディレクトリにコピーします msvcrt.dll ファイルを Apache インストール ディレクトリにコピーします 3. conf/srm.conf ファイルを開き、その中に文 を追加します。 conf/mod_php4.conf を含める これを行う前に、httpd.conf 内の CGI モードに関する設定ステートメント、つまり以下のような部分をすべて削除してください。
以下は引用内容です: ScripAlias/php4/ "C:/php4/" AddType application/x-httpd-php4.php AddType application/x-httpd-php4.php3 AddType application/x-httpd-php4.php4 アクション application/x-httpd-php4/php4/php.exe

PHP でさらに多くのサフィックスをサポートしたい場合でも、問題ありません。指定された設定ファイル mod_php4.conf はすでに php、php3、および php4 の 3 つのサフィックスをサポートしています。さらに多くのサフィックスをサポートしたい場合は、このファイルを変更するだけです。

4. テスト

﹤?phpinfo();?﹥を使用してテストします。 Server API の値が CGI ではなく Apache であることがわかります。また、HTTP ヘッダー情報に関する情報もあります。



関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のおすすめ
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート