PHP+APACHEを使用してユーザー認証を実装する方法
站 プロフェッショナルな Web プラットフォームでは、多くの場合、ユーザーはユーザーのアカウントとパスワード、つまり本人確認のアクションを必要とします。初期の NCSA httpd サーバーはこのユーザー認証機能を提供しておらず、Webmaster は手動で本人認証 CGI プログラムを作成することしかできませんでした。
CERN httpd 以降のほとんどの Web サーバーは、ユーザーの本人確認機能を提供しています。各 Web サーバーの設定は異なりますが、設定は似ています。
Apacheサーバーでのユーザー認証設定は以下の通りです。
<Directory /home/MyMember> AuthType Basic AuthName MyMember AuthUserFile /usr/local/MyMember.txt Options Includes ExecCGI <Limit GET POST> require valid-user </Limit> </Directory>
この例では、ユーザーが画像ファイルやその他のさまざまなファイルを含む、MyMember ディレクトリ内のすべてのファイルを表示するときに、ユーザーのアカウントとパスワードの確認が要求されます。ユーザーのアカウントとパスワードのファイルは /usr/local/MyMember.txt に存在します。
アカウントのパスワード ファイル /usr/local/MyMember.txt は次の例のようになります。コロンの前の文字列はユーザー アカウントで、コロンの後の文字列は還元不可能に暗号化されたパスワードです。通常、パスワードの最初の 2 文字はシード (ソルト) に似た文字です。今回は全て3Pです。各行はユーザーを表します。もちろん、ウェブマスターは重複アカウントの状況を自分で制御する必要があります。特別なのは、Apache が Win32 システムで起動される場合、Win32 はこの領域
API でエンコーディングを提供しないため、コロン以降のパスワードを暗号化できないことです。したがって、ユーザー パスワードはクリア コードで存在します。
john1234:3PWudBlJMiwro queenwan:3PFNVLNPN9W0M noname00:3PEsXaJx5pk7E wilson49:3PjoWb0EnaG22 rootboot:3PIt0snI6.84E sun_moon:3PvymMeNOc.x. nobody38:3PbskPKwV94hw
すべての設定が完了すると、接続時にブラウザにパスワード認証ウィンドウが表示されます。上の写真は、SEEDNet の MySEED Web サイトのユーザー認証メカニズムです。アカウントとパスワードを入力すると、ブラウザはそれをBASE64でエンコードしてサーバーに送信します。もちろん、BASE64 は暗号化ではなくエンコードだけなので、インターネット上でのこの種の通信のセキュリティはまだ高くありません。途中で実行者によって傍受され、その後 BASE64 に復元される可能性があります。これが最大の欠陥でもあります。おそらく、この問題は、将来的にはダイジェスト認証 (Digest) をサポートし、md5 エンコーディングを使用することで解決される可能性があります。その後も、各ページでアカウントとパスワードが必要になりますが、ブラウザが自動的にアカウントとパスワードを送信するため、アカウントとパスワードを入力する必要はありません。この要素はブラウザを閉じるまで保持され、次回ブラウザを再実行するときに初めて入力する必要があります。
ユーザー数が少ない場合は、上記の方法を使用すると簡単で問題がありません。しかし、ユーザー数が数万人、場合によっては数十万人になると、アカウントのパスワードを検索することでサーバー全体の効率が低下し、ページを読むのに数十秒から数分かかることがあります。この場合、サーバーが提供するパスワード検査メカニズムを使用するのは賢明ではありません。 NSAPI を使用すると、Netscape EnterPRise Server で独自のチェック方法を開発できます。また、IIS で ISAPI フィルタを使用することもできます。 NSAPI/ISAPI を呼び出す C/C++ プログラムを作成するのはいつも面倒です。PHP には別の選択肢があります。これがこのセクションのトピックでもあります。
PHPのHTTP関連関数ライブラリはheader()関数を提供します。多くの Web サーバーとクライアントの対話では、この関数を使用して魔法を実行できます。たとえば、次のプログラムを PHP ページの先頭、つまり 1 行目または 2 行目に追加すると、ユーザーを作成者の Web ページにリダイレクトできます。
<?php header("Location: http://wilson.gs"); exit; ?>
もちろん、上記プログラム以降のHTMLテキストやPHPプログラムがユーザー側に現れることはありません。
同じ理由で、header() を使用してユーザー認証トリックを実行します。 PHPの開始時にユーザーに文字列を送信すると、ユーザーには以下のようなウィンドウが表示されます。
<?php Header("WWW-Authenticate: Basic realm="Member""); Header("HTTP/1.0 401 Unauthorized"); ?>
在程式中字串 realm="Member" 中的 Member 字样出现在图中,当然若使用中文字取代,浏览器端也会出现中文字,如上面的 MySEED 图。若 Web 站台使用者还有其它语文,如英文或日文,送出中文的 realm 字串似乎就比较不合适。无论如何,这都要视站台的性质及使用者定位而决定。
当然这还是很粗糙,因为除了送出视窗后,就没有下文了,帐号输入正确也好,输入错误也罢,都不会有任何的结果。我们需要再更进阶的程式来处理。
在后端的使用认证上,考虑使用资料库作为储存帐号及密码的后端,在这种架构可以容纳许多的使用者,管它一万个使用者还是十万个使用者。若您的站已有数十万个使用者帐号,那么恭喜您,您的站算是世界级的大站了。MySQL 是个不错的选择,许多站台,甚至是商业化的站台都用它来做后端的资料库。当然您要架真正的商业站台,钱不是问题的话,那可以使用口碑最广的 Oracle 资料库系列。
要在 PHP 中使用任何资料库,都要先将资料库的伺服器端及客户端设定好,之后才编译 PHP 及 Apache 系统。
准备好 MySQL 及 PHP 之后,先在 MySQL 中加入新的资料库,本例是加入mymember,用别的名字当然也可以。MySQL 要加入资料库 (Database) 很容易,只要在MySQL 存放 Database 的地方 mkdir 就可以了。例如在 UNIX Shell 下打
hahaha:/usr/local/mysql/data# mkdir mymember
在建立了资料库之后,尚需要建立资料表格 (Table) 方能使用。设定的表格如下,可以将它储在 /tmp/memberauth.sql 中
CREATE TABLE MemberAuth ( Serial mediumint(9) NOT NULL auto_increment, Username char(8) NOT NULL, PassWord char(8) NOT NULL, Enable char(1) DEFAULT ’0’ NOT NULL, PRIMARY KEY (Serial) );
档案 memberauth.sql
先看看 memberauth.sql 的这些栏位。Serial 是个自动增加的整数栏位,每输入一笔资料,就会自动加一,这当然不能是空的栏位,于是就用 NOT NULL 了。第二个栏位是 Username,代表使用者的帐号,为了统一以及适应各系统起见,设定成八个字,当然这个栏位也不能是空的。Password 是第三个栏位,为使用者的密码。第四个栏位 Enable 做为帐号是否有效的旗标,设计上 0 表示无用,1 表可用,日后还可加入其它值做不同的用途。
设计好了资料表之后,就要将资料表加入资料库了。由于常要使用 MySQL 资料库,可以到 http://www.phpwizard.net/phpMyAdmin 下载 phpMyAdmin,使用浏览器操作及管理 MySQL,轻松又方便。若使用这套 phpMyAdmin 可以在它的使用者介面上输入memberauth.sql 加入 MySQL 中。或者也可以在 UNIX Shell 下输入下式,也是有同样的效果。
mysql mymember < /tmp/memberauth.sql
在准备好了之后,就可以输入使用者帐号及密码在 memberauth 资料表中了。当然还是使用 phpMyAdmin 方便,用 mysql 程式就要一笔笔的 INSERT 了。
接着进入了设计函式的阶段了。
<?php file://--------------------------- // 使用者认证函式 auth.inc // Author: Wilson Peng // Copyright (C) 1999 file://--------------------------- $error401 = "/home/phpdocs/error/401.php"; if ($PHP_AUTH_PW=="") { Header("WWW-Authenticate: Basic realm="超金卡会员""); Header("HTTP/1.0 401 Unauthorized"); include($error401); exit; } else { $db_id = mysql_pconnect("localhost", "myid", "mypw"); $result = mysql_db_query("mymember","select password, enable from MemberAuth where username=’$PHP_AUTH_USER’"); $row = mysql_fetch_array($result); $MemberPasswd = $row[0]; $MemberEnable = $row[1]; if ($MemberEnable==0) { echo "您的帐号被停用了"; exit; } if ($PHP_AUTH_PW!=$MemberPasswd) { Header("WWW-Authenticate: Basic realm="超金卡会员""); Header("HTTP/1.0 401 Unauthorized"); include($error401); exit; } } ?>
Copyright (C) 1999, Wilson Peng
要使用这个 auth.inc,要在每个 PHP 的第一行加入
<? require("auth.inc"); ?> 。
在加入本程式的 PHP 档案都会检查帐号密码,图片等就不会检查,比起使用 Web 伺服器功能的某目录下全都检查,PHP 显得有弹性多了。
$error401 = "/home/phpdocs/error/401.php";
这行表示在使用者按下取消,或检查失败时,要显示给使用者看的档案。
if ($PHP_AUTH_PW=="") { Header("WWW-Authenticate: Basic realm="超金卡会员""); Header("HTTP/1.0 401 Unauthorized"); include($error401); exit; } else
到 else 之前,若没有传入密码,则送出输入密码的视窗。其中的
$PHP_AUTH_USER、$PHP_AUTH_PW 是 PHP 中特殊的变数,分别代表使用者确认的帐号及密码。上面的程式也是利用这二个变数来处理使用者认证。
$db_id = mysql_pconnect("localhost", "myid", "mypw"); $result = mysql_db_query("mymember","select password, enable from MemberAuth where username=’$PHP_AUTH_USER’"); $row = mysql_fetch_array($result); $MemberPasswd = $row[0]; $MemberEnable = $row[1];
若使用者有输入帐号及密码,则向资料库查询。同时查核该使用者是否仍可使用。
if ($MemberEnable==0) { echo "您的帐号被停用了"; exit; }
上四行程式为帐号被停用的情形。
if ($PHP_AUTH_PW!=$MemberPasswd) { Header("WWW-Authenticate: Basic realm="超金卡会员""); Header("HTTP/1.0 401 Unauthorized"); include($error401); exit; }
密码错误则再次向使用者要求输入帐号及密码。
在实际使用时,可以视需要加入的网页再加入 auth.inc 这个档案,就不用连看张图形也要查一次密码,降低伺服器和使用者二端的资源。当然,和 MySQL 的连系上,可以使用 mysql_pconnect() 一直和 MySQL 伺服器连线。或是使用mysql_connect() 每次重新连线,用这个函式要记得早点使用 mysql_close() 将资料库关闭。下面的程式 auth1.inc 是另一版本的认证程式,就是开启连线后马上关闭,释放资源的例子。
以上就是PHP+APACHE实现用户验证的方法的内容,更多相关内容请关注PHP中文网(www.php.cn)!

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











多くの場合、キーワードと追跡パラメーターで散らかった長いURLは、訪問者を阻止できます。 URL短縮スクリプトはソリューションを提供し、ソーシャルメディアやその他のプラットフォームに最適な簡潔なリンクを作成します。 これらのスクリプトは、個々のWebサイトにとって価値があります

2012年のFacebookによる有名な買収に続いて、Instagramはサードパーティの使用のために2セットのAPIを採用しました。これらはInstagramグラフAPIとInstagram Basic Display APIです。

Laravelは、直感的なフラッシュメソッドを使用して、一時的なセッションデータの処理を簡素化します。これは、アプリケーション内に簡単なメッセージ、アラート、または通知を表示するのに最適です。 データは、デフォルトで次の要求のためにのみ持続します。 $リクエスト -

これは、LaravelバックエンドとのReactアプリケーションの構築に関するシリーズの2番目と最終部分です。シリーズの最初の部分では、基本的な製品上場アプリケーションのためにLaravelを使用してRESTFUL APIを作成しました。このチュートリアルでは、開発者になります

Laravelは簡潔なHTTP応答シミュレーション構文を提供し、HTTP相互作用テストを簡素化します。このアプローチは、テストシミュレーションをより直感的にしながら、コード冗長性を大幅に削減します。 基本的な実装は、さまざまな応答タイプのショートカットを提供します。 Illuminate \ support \ facades \ httpを使用します。 http :: fake([[ 'google.com' => 'hello world'、 'github.com' => ['foo' => 'bar']、 'forge.laravel.com' =>

PHPクライアントURL(CURL)拡張機能は、開発者にとって強力なツールであり、リモートサーバーやREST APIとのシームレスな対話を可能にします。尊敬されるマルチプロトコルファイル転送ライブラリであるLibcurlを活用することにより、PHP Curlは効率的なexecuを促進します

顧客の最も差し迫った問題にリアルタイムでインスタントソリューションを提供したいですか? ライブチャットを使用すると、顧客とのリアルタイムな会話を行い、すぐに問題を解決できます。それはあなたがあなたのカスタムにより速いサービスを提供することを可能にします

2025 PHP Landscape Surveyは、現在のPHP開発動向を調査しています。 開発者や企業に洞察を提供することを目的とした、フレームワークの使用、展開方法、および課題を調査します。 この調査では、現代のPHP Versioの成長が予想されています
