アクセス認証

ユーザー認証と識別

なぜアクセス認証が必要なの?

Webサイトは通常、アクセスしてきた人すべてに公開するものですが、掲載する情報は、誰にでも公開していいものと、一部の関係者にだけ公開したいものとに分けることができます。
たとえば、業務連絡などに使用するスタッフのみが利用できるページや、会員用、常連用などのページを設けることで、コンテンツの見せ方などに工夫をこらすことができるようになるのです。
セキュリティを向上させ、悪意のあるユーザの締め出しや、Webショッピングならば、会員限定の商品や特別価格の商品の販売など、アクセス制限は様々な用途で用いられています。

Webページにアクセス制限をかけることで、セキュリティを向上させるだけではなく、様々な形でコンテンツを見せる事が可能になります。

phpのユーザー認証

PHPで利用できるユーザ認証には、WebサーバのApacheの認証機能を利用する方法と、PHPのプログラミングで実現する方法があります。ここでは、PHPで簡単に利用できるアクセス認証を設定します。

また、データベースにユーザIDとパスワードを格納しておき、入力されたIDとパスワードの正当性をチェックすることができます。PHPはいくつかの関数の組み合わせることで、データベースを簡単に操作できるので、より本格的なユーザ認証機能を作成することができます。

入力値の有無で判断するアクセス認証

入力値を調べて認証する

ここでは、ユーザ名とパスワードの入力を促すダイアログを表示させ、キャンセルされるかどうかを判別するだけの簡単なスクリプトを作成します。

※ダイアログとは・・・

「ダイアログ」とは「対話」という意味で、コンピュータから人間に何かを伝えるときにメッセージを表示するために使われます。正式にはダイアログボックスのことで、エラーメッセージの表示や操作の確認要求などに用いられるウィンドウのことです。

ダイアログを表示

    <?php

        if( !isset( $_SERVER[ 'PHP_AUTH_USER' ] ) ) {

            header( 'WWW-Authenticate: Basic realm = "Private Page"' );

            // 認証エラー
            header( 'HTTP/1.0 401 Unauthorized' );

            // 認証エラーであることを知らせるメッセージを出力
            die( "このページを見るにはログインが必要です" );

        } else {

            echo "<p>入力したユーザー名 : {$_SERVER[ 'PHP_AUTH_USER' ]}</p>";
            echo "<p>入力したパスワード : {$_SERVER[ 'PHP_AUTH_PW' ]}</p>";
        }
    ?>
    

ユーザ認証が必要なページにクライアントからアクセスがあった場合、「Authorization」ヘッダの有無を確認します。PHPでこの確認を行う場合は、定義済みの変数である「$_SERVER」の値をチェックします。$_SERVER は、ヘッダ、パス、スクリプトの位置のような情報を有する配列です。この配列の中の「PHP_AUTH_USER」(HTTP認証しているときのユーザー名)に対応する値の有無で確認します。「Authorization」ヘッダが無かった場合、認証ダイアログをブラウザで表示するようサーバ側からクライアントへ指示を出します。これには※header()関数を使用して記述します。

ダイアログ

認証ダイアログ上でキャンセルを選択した場合、※die()でメッセージを出力し、現在のスクリプトを中止します。

キャンセルボタンを押下

このページを見るにはログインが必要です

認証ダイアログ上で、ユーザー名やパスワードを入力した上で、OKを選択した場合、「Authorization」ヘッダに入力されたユーザー名とパスワードの情報を付加した状態で、再度サーバへリクエストを送ります。そのため、改めて $_SERVER['PHP_AUTH_USER'] に値が設定されているかどうかがチェックされ、上記のスクリプトではelse部分の処理が走ります。

入力したユーザー名 :入力した文字
入力したパスワード :入力した文字

※Authentication(認証)とAuthorization(承認)

Authentication(認証)では、ユーザが入力したID、パスワードが正確なものかを確認し、ユーザ情報を取得します。例えば、ログインフォームにID、パスワードを入力してサブミットする際の処理です。

Authorization(承認)では、現在アクセスしてきているユーザに与えられている権限をチェックします。例えば、認証が必要なエリアを閲覧する際の処理になります。認証が必要な場合はログインフォームの表示を行います。

※header()関数

header()関数を使用すると、HTTPヘッダを送信することができます。
例えば、ユーザが使用しているブラウザに応じたTOPページに移動させたり、認証されていないユーザをログイン画面に移動させるなど、ユーザを別のページに移動させる処理を行います。

※die()

exit()のエイリアス(別名)で、メッセージを出力し、カレントのスクリプトを終了します。
die、exitとも関数ではなく、PHPの言語構造です。

ユーザー名とパスワードで判断するアクセス認証

ユーザー名とパスワードを調べて認証する

前節の認証スクリプトをベースに、あらかじめ定めたユーザ名とパスワードに一致するか判断する認証を実現します。これを、ベーシック認証といい、Webサイトで用いられる、最も標準的なユーザー認証の方式です。

下記のスクリプトでは、認証スクリプト中に指定したユーザ名とパスワードと、ダイアログに入力された値を比較して認証しています。

ユーザ名とパスワードを認証させる

    <?php

        $user = "admin";
        $password = "pass";

        if( !isset( $_SERVER[ 'PHP_AUTH_USER' ] ) ) {

            header( 'WWW-Authenticate: Basic realm = "Private Page"' );
            header( 'HTTP/1.0 401 Unauthorized' );

            die( "このページを見るにはログインが必要です" );

        } else if( isset( $_SERVER[ 'PHP_AUTH_USER' ] ) ) {

            if( $_SERVER[ 'PHP_AUTH_USER' ] != $user
                || $_SERVER[ 'PHP_AUTH_PW' ] != $password ) {

                header( 'WWW-Authenticate: Basic realm = "Private Page"' );
                header( 'HTTP/1.0 401 Unauthorized' );

                die( "このページを見るにはログインが必要です" );

            } else {

                echo "ようこそ!";
            }
        }
    ?>
    
このページを見るにはログインが必要です
ようこそ!

上記スクリプトを実行し、データベースに登録してあるユーザー名、パスワードが一致した場合は「ようこそ!」が表示され、一致しないまたは入力をしない場合は「このページを見るにはログインが必要です」が表示されます。ここでは、データベースに関しては省略します。

※ベーシック認証の欠点

ベーシック認証では、入力された情報に何の暗号化も施さずに、平文(クリアテキスト)としてユーザー名とパスワードをサーバーに送信するため、通信途上で第3者に盗聴されれば簡単に情報が盗まれてしまう危険性があります。
そこで、指定したIPアドレスからのアクセスを許可・拒否することのできるIP認証や、ユーザ名やパスワードの認証情報を暗号化して送受信するSSH認証や、SSL認証などの暗号化認証を組み合わせ、セキュリティを向上させる手法がよくとられます。