ホームページ >バックエンド開発 >PHPチュートリアル >PHP フォームベースのパスワード認証と HTTP 認証の使用法_PHP チュートリアル
PHP の HTTP 認証メカニズムは、PHP が Apache モジュールとして実行されている場合にのみ機能するため、この機能は CGI バージョンには適用されません。 Apache モジュールの PHP スクリプトでは、header() 関数を使用して「認証が必要」情報をクライアント ブラウザに送信し、ユーザー名とパスワードの入力ウィンドウをポップアップ表示させることができます。ユーザーがユーザー名とパスワードを入力すると、URL を含む PHP スクリプトによって事前定義された変数 PHP_AUTH_USER、PHP_AUTH_PW、および AUTH_TYPE が追加され、これら 3 つの変数がそれぞれユーザー名、パスワード、認証タイプに設定されます。事前定義された変数は、$_SERVER または $HTTP_SERVER_VARS 配列に保存されます。 「ベーシック」および「ダイジェスト」(PHP 5.1.0 以降) 認証方法をサポートします。詳細については、header() 関数を参照してください。
PHP バージョンの問題: $_SERVER などを含むオートグローバル グローバル変数は PHP 4.1.0 以降で有効であり、$HTTP_SERVER_VARS は PHP 3 以降で有効です。
以下は、ページでクライアント認証を強制するスクリプトの例です:
例 34-1. 基本的な HTTP 認証の例
上記の例では、PHP_AUTH_USERとPHP_AUTH_PWの値のみが出力されていますが、実際のアプリケーションでは、ユーザー名とパスワードの正当性をチェックする必要がある場合があります。おそらく、データベース チュートリアルのクエリを実行するか、dbm ファイルから取得します。if (!isset( $_SERVER [ 'PHP_AUTH_USER' ])) {
header ( 'WWW-Authenticate: Basic realm="My Realm"' );
header ( 'HTTP/1.0 401 Unauthorized' );
echo 'ユーザーがキャンセルボタンを押した場合に送信するテキスト'
} else; {
echo "こんにちは { $_SERVER [ 'PHP_AUTH_USER' ]} .
" ;
echo "パスワードとして { $_SERVER [ 'PHP_AUTH_PW' ]} を入力しました。< / p>" ;
}
?>
例 34-2. ダイジェスト HTTP 認証の例
この例では、単純なダイジェスト HTTP 認証スクリプトを実装する方法を示します。詳細については、RFC 2617 を参照してください。 $realm = '制限エリア' ;
//user => パスワード$users = array( 'admin' => 'mypass' , 'guest' => 'guest' ) ;
if (!isset( $_SERVER [ 'PHP_AUTH_DIGEST' ])) {
die( 'ユーザーがキャンセルボタンを押した場合に送信するテキスト' ); }
ヘッダー ( 'HTTP/1.1 401 Unauthorized' );
ヘッダー ( 'WWW-Authenticate: Digest realm="' . $realm .
' " qop="auth" nonce="' . '" opaque="' . md5 ( $realm ). '"' );preg_match ( '/username="(?P
// PHP_AUTH_DIGEST 変数を分析します.*)",s*realm="(?P .*)",s*nonce="( ?P .*)",s*uri="(?P .*)",s*response="(?P .*)",s*opaque="(?P< ;不透明>.*)",s*qop=(?P .*),s*nc=(?P .*),s*cnonce="(?P .*) "/' , $_SERVER [ 'PHP_AUTH_DIGEST' ], $digest ); die( 'ユーザー名が無効です!' );
if (!isset( $users [ $digest [ 'username' ]]))// 有効な応答を生成します
$A1 = md5 ( $digest [ 'username' ] . ':' . $realm . ':' . $users [ $digest [ 'username' ]]); $_SERVER [ 'REQUEST_METHOD' ]. ':' . $digest [ 'uri' ]);
$valid_response = md5 ( $A1 . ':' . $digest [ 'nonce' ]. ':' . $digest [ ' nc' ]. $digest [ 'cnonce' ]. $digest [ ':' . $A2 );
if ( $digest [ 'response' ] valid_response )
die( '認証情報が間違っています!' );// OK、有効なユーザー名とパスワード
echo '次のようにログインしています: ' $digest [ 'username' ];?>
互換性の問題: HTTP ヘッダー コードを記述するときは注意してください。すべてのクライアントとの互換性を確保するには、キーワード「Basic」の最初の文字を大文字の「B」にする必要があり、区切り文字列を (一重引用符ではなく) 二重引用符で囲む必要があり、ヘッダー行に HTTP/1.0 401 が必要です。 401 の前にちょうど 1 つスペースを入れてください。
一部の Internet Explorer ブラウザには独自の問題があることに注意してください。ヘッダーの順序が少し面倒なようです。現在、HTTP/1.0 401 を送信する前に WWW-Authenticate ヘッダーを送信すると、この問題が解決される可能性があるようです。
PHP 4.3.0 では、従来の外部メカニズムで認証されたページからパスワードを取得するスクリプトを誰かが作成するのを防ぐために、特定のページで外部認証が有効で、セキュリティ モードがオンになっている場合、 PHP_AUTH 変数は設定されません。ただし、REMOTE_USER を使用して外部認証されたユーザーを識別できるため、$_SERVER['REMOTE_USER'] 変数を使用できます。
設定手順: PHP は AuthType ディレクティブを使用して、外部認証メカニズムが有効かどうかを判断します。
これでも、誰かが認証されていない URL を使用して、同じサーバー上の認証された URL からパスワードを盗むことを防ぐことはできないことに注意してください。
Netscape Navigator と Internet Explorer の両方のブラウザは、401 サーバー リターン メッセージを受信すると、ドメイン全体のすべてのローカル ブラウザの Windows 認証キャッシュをクリアします。これにより、ユーザーが効果的にログアウトされ、ユーザー名とパスワードの再入力が強制される可能性があります。このメソッドをログイン ステータスを「期限切れ」にするため、または「ログアウト」ボタンの応答動作として使用する人もいます。
例 34-3. ユーザー名とパスワードの再入力を強制する HTTP 認証の例
functionauthenticate () {
if (!isset( $_SERVER [ 'PHP_AUTH_USER' ) ) ||
header ( 'WWW-Authenticate: Basic realm="Test Authentication System"' ) ;
header ( 'HTTP/1.0 401 Unauthorized' );
echo "このリソースにアクセスするには、有効なログイン ID とパスワードを入力する必要があります" ;
}( $_POST [ 'SeenBefore' ] == 1 && $_POST [ 'OldAuth' ] == $_SERVER [ 'PHP_AUTH_USER' ])) {
n" ;
認証 () }
else {
echo "< p> ;ようこそ: { $_SERVER [ 'PHP_AUTH_USER' ]}
" ;
echo "古い: { $_REQUEST [ 'OldAuth' ]} " ;
echo "
}
次の例では、2 つの変数 $PHP_AUTH_USER と $PHP_AUTH_PW を使用して、参加者が合法であるかどうかを確認し、入場を許可します。この例では、ログインを許可されるユーザー名とパスワードのペアはそれぞれ tnc と Nature です:
if(!isset($PHP_AUTH_USER))
{ Header("WWW-Authenticate: Basic) realm ="My Realm""); Header("HTTP/1.0 401 Unauthorized"); echo "ユーザーがキャンセルボタンを押した場合に送信するテキスト"; exit; } else {if ( !($PHP_AUTH_USER=="tnc" && $PHP_AUTH_PW=="nature") ) { // ユーザー名とパスワードのペアが間違っている場合は、再認証を強制します Header("WWW-認証: Basic realm="My Realm"); Header("HTTP/1.0 401 Unauthorized"); echo "エラー : $PHP_AUTH_USER/$PHP_AUTH_PW が無効です。"; exit; } else
{ echo "Welcome tnc!"; ?>
実際、上記のコード スニペットでは明らかなユーザー名とパスワードのペアは使用されません。データベースまたは暗号化パスワード ファイルを使用してアクセスします。
6.3 指定された検証情報に基づいてユーザーの身元を確認する
まず、次のコードを使用して、ユーザーがユーザー名とパスワードを入力したかどうかを判断し、ユーザーが入力した情報を表示します。
if (!isset($PHP_AUTH_USER)) {
header('WWW-Authenticate: Basic realm="My Private Stuff"');
header('HTTP/1.0 401 Unauthorized') );echo '認証が必要です。'; PHP_AUTH_PW
認証の種類: $PHP_AUTH_TYPE"; } ?>説明:
isset( ) 関数変数に値が割り当てられているかどうかを判断するために使用されます。変数値が存在するかどうかに応じて、true または false を返します。
header() 関数は、特定の HTTP ヘッダーを送信するために使用されます。 header() 関数を使用する場合は、実際の出力を生成する HTML または PHP コードの前に必ずこの関数を呼び出してください。
上記のコードは非常に単純で、ユーザーが入力したユーザー名とパスワードを実際の値に基づいて効果的に検証するものではありませんが、少なくとも、PHP を使用してクライアント側で入力ダイアログ ボックスを生成する方法は理解できました。
それでは、指定された認証情報に基づいてユーザーの本人確認を行う方法を見てみましょう。コードは次のとおりです。
if(empty($password) || empty($ cpassword))
if (!isset($PHP_AUTH_USER)) {
header('WWW-Authenticate: Basic realm="My Private Stuff"');
header(' HTTP/1.0 401 権限がありません');
exit
else if (isset($PHP_AUTH_USER)) {
if (($PHP_AUTH_USER != "admin") | | ($ PHP_AUTH_PW != "123")) {
header('WWW-Authenticate: Basic realm="My Private Stuff"')
header('HTTP/1.0 401 Unauthorized');必須。' ;
終了
} else {
echo "
}
?>まずユーザーがユーザー名とパスワードを入力したかどうかを確認します。入力していない場合は、対応するダイアログ ボックスがポップアップ表示され、ユーザーに ID 情報の入力を求めます。その後、ユーザーが入力した情報が指定されたユーザー アカウント admin/123 と一致するかどうかを判断して、ユーザーにアクセス権を付与するか、正しい情報の再入力を促します。この方法は、すべてのユーザーが同じログイン アカウントを使用するサイトで機能します。
6.4 もう一つの簡単なパスワード検証
Windows 98 で PHP スクリプトを作成して実行する場合、または Linux でデフォルト設定に従って PHP を CGI プログラムとしてインストールする場合、上記の PHP は使用できません。プログラムは検証機能を実装するために使用されます。このため、Wubian は別の簡単なパスワード検証方法を提供します。あまり実用的ではありませんが、学習には適しています。
if($_POST[Submit]=="Submit"){ //ユーザーがデータを送信する場合、操作を実行します
$password=$_POST[password] //ユーザーが入力したデータを取得します。 user, そして変数に保存しますpassword
$cpassword=$_POST[cpassword]; //ユーザーが入力した確認データを取得し、変数に保存します $cpassord{
die("パスワードを空にすることはできません!");}
elseif ( ((strlen($password) < 5) || (strlen($password) > 15))){
die("パスワードの長さは 5 と 15");}
//--- 値の比較
elseif (!(strlen($password) == strlen($cpassword)))
{
die("パスワードを 2 回入力しましたdo not match! " );
}
elseif( !($password === $cpassword)) //値とデータ型を比較します
{
die("2 つのパスワードが一致しません! ");
}
else / /ループパスワード出力、パスワードなので*記号
{
for ($i=0;$ihtml> フォーム検証 - パスワード フィールド検証
< form name="form1" method="post" action="=$_SERVER['PHP_SELF'] ?>">
パスワードを入力してください:< ;input type="text" name="password" >
パスワードの確認: