パスワード認証の方法と作り方

人に見られたら困るページをわざわざパスワード認証してサイトに置くなという話は置いといて。 パスワード認証と言っても、基本は単にフォームから送られてきた変数がパスワードとして用意している文字列と同じかどうかを判定するだけ。
つまり、フォームの(この辺詳しくはフォームからのデータの取得参照)
<input type="text" name="password">
で送られてきた変数を
$pass = $_POST["password"]
で受け取って、$passが正解かどうかを判定する。
まとめると

<?php
$pass = $_POST["password"];
$seikai = "seikaidayo";
if($pass != $seikai){
print('
<form name=form method=post action=ninsyou.php>
パスワード <input type=text name=password>
<input type=submit name=submit value=送信>
</form>
');
 die('パスワードを入力してログインして下さい');
}else{
 $type = mt_rand(1000,9999);
 print ("合ってます");
}
?>

で、合ってればelse以下が処理されるので、そこに認証が通った場合の処理を書く。
ifのところで!=としているのは別に意味は無い。
ifの途中に処理を書くよりelse以下の最後に書くほうがあとあと分かりやすいと思ったから。

そのページ内にテキスト書いて終わりって事ならこれだけでいいのだが、 普通は違うページのリンクとかデータとかincludeしたりとかあるわけで、 そもそもそっちに見られたくない事書いてたら当たり前だが各ページでも認証しなければ意味が無い。
で、上で書いた物をそれぞれのページに書いたとしたらページ変位する度に認証画面が出てめんどくさいことこの上ない。
つまり、一度認証が通ったら他のページにも値を渡し、認証をスルーする。
簡単な方法はリンクにパスワードを持たす事だが、例えば .php?password=パスワードそのもの なんてことをしてしまったら、 無いとは思うがそのページから別サイトにリンクしてると、 相手先にバレバレとなってしまう。
ここで一時的に有効な変数を作り、それを送信する。
そのためにランダム値を得るのに使う関数は
mt_rand
これで適当な数字が生成できる。
実際には
$type = mt_rand(1000,9999);
として、$typeに1000〜9999までの4桁のランダム値を持たしている。
そしてページ内のリンクに
.php?type=$type
とすることで変数を送信、$_GETで受け取り、発行された$typeが同じであれば(ブラウザを閉じない限り当たり前だが同じ)$pass = $seikai として認証をパスできる。 仮にそのページから他サイトにリンクを貼っていたとしても、 相手方が得られるリファラーは .php?type=ランダム値 となり、 他のブラウザからその値でブラウズしても無効となる。 まとめると

<?php
$pass = $_POST["password"];
$seikai = "seikaidayo";
if($type = $_GET['type']){
 $pass = $seikai;
}

if($pass != $seikai){
print('
<form name=form method=post action=ninsyou.php>
パスワード <input type=text name=password>
<input type=submit name=submit value=送信>
</form>
');
 die('パスワードを入力してログインして下さい');
}else{
 $type = mt_rand(1000,9999);
 print ("合ってます");
 print ("<a href=ninsyou.php?type=" . $type . ">1度認証通ったらリンクはこうすればスルー</a>");
}
?>

適当にやってるので穴があるかどうかは知らない。 個人的にはやりたくないがクッキーを使ったり、対となるIDを持たすほうがいいのは言うまでもない。



サンプル

著作権について
ファイルからデータの読み込み
ファイルへのデータの書き込み
フォルダ内のファイル名取得
アクセスカウンターの作り方
アンケートの作り方
フォームからのデータの取得
フォーム以外のページからのデータの取得
ファイル内、文章内の文字列の検索
パスワード認証の方法と作り方

0から始めるPHP

PHPのすすめ(これ飛ばしてもいい)
必要な環境とPHPへのアクセス
開発に使うもの
初めての方への注意点
PHPの基本(何らかの言語経験者向け)
PHPの基本(初めての人向け)
書き方
ファイルの読み込み

プログラミング講座
文字などの出力
PHPにおける変数
ifによる条件比較
forによる繰り返し処理
PHPにおける配列
これまでとこれからの学び方

PHPの使える
おすすめレンタルサーバー

スタードメイン

レンタルサーバーの選び方


その他

プログラミングのコツ
プログラマーと年齢
誰でも簡単にできるサーバー負荷対策
社内や自宅サーバーのグローバルIPアドレスが変わってもアクセスできるようにする

日記

2014年
日本語形態素データとキーワード出現回数
Androidベースのゲーム機に期待
4月末に判明したIEの脆弱性について
フラッシュプレーヤーの製作
ホームページとウェブサイトの違い
WIFIなどの用語は正しく使いたい
国産ゲーム会社のサイトについて
検索エンジンの開発について
プレインストールWindowsからの脱却
Android・iPhoneとアプリ開発
Windows8、スタートボタンはもういらない?
サイトの作成とやるやらないは別
あの人は詳しいと言う人と言われる人
index.htmlと/の正規化について
AndroidOSとLinuxOS
モバイル端末で必ず見るもの
ユーザー参加型市民アプリ

2013年2月
2013年1月
2012年12月
2012年11月
2012年10月
2012年9月