最新記事
(06/29)
(06/04)
(06/03)
(05/30)
(05/28)
|
ニュース
この欄には、このブログの内容に関連するニュースを掲載する予定です。
|
PHP ユーザーパスワード1:ファイルの読込み
前回の「PHP シークレットページ8(配列・while) 」までは、ページ内に文字列または配列でパスワードを埋め込んでいました。今回からは、外部のファイルに記録されたパスワードを読み込む形式のものを考えていきたいと思います。
サイト内に鍵付のページが少ない場合には、ページのそれぞれにパスワードを埋め込む形も悪くはないと思いますが、閲覧制限をかけたいページが多い場合には、ページを作成する際も、また、パスワードの登録、変更、削除の際も面倒です。パスワード用のファイルを1つ作成しておけば、いろいろなページでこれを読み込んで、閲覧させるかさせないか判断させることができます。
MySQLやSQLiteなどのデータベースを利用する方法もありますが、レンタルサーバーによっては、これらのデータベースを利用できないものがあります。一般のファイルでもユーザー管理程度なら可能なので、まずはデータベースを利用しない方法で考えることにしましょう。
次のようなパスワードのリストのファイルを作成します。
[ソース]usrpwd1_list.php
ファイルを置くディレクトリが、一般ユーザーがアクセスできないところにあれば、普通のテキストファイルでもいいのでしょうが、外部からアクセスできるディレクトリに置かざるをえない場合には、一般のテキストファイルでは問題があります。万一、そのテキストファイルのパスがわかってしまったら、その内容がブラウザで見えてしまうからです。
ブラウザから見えないようにするには、PHPファイルにすればいいのではないかと考えました。
(これでセキュリティ的に安全かと言われると、初心者の私としては自信はありません。けれども、少なくとも私は、PHPファイルの内容を外部から覗く方法は知りません。セキュリティについては、自分でしっかり勉強しなければならない分野であり、他人の言うことをそのまま信じてはいけないと思います。念のため。)
そこで、ファイル名の拡張子を「.php」とし、記述の最初の行を「<?php」、最後の行を「?>」として、その間に1行ずつパスワードを書き込みました。ブラウザでこのファイルにアクセスしたら、何も表示されません。ブラウザの表示でソースも確かめました。ここも何も表示されません。OKということにしました。
次に、これを読み込むPHPファイルのソースを示します。
[ソース]usrpwd1.php
「$line=file("usrpwd1_list.php");」で、パスワードリストのファイルを読み込んで配列に格納します。
「foreach($line as $password)」で、配列から1つずつ取り出し、その値を$passwordに入れます。
「$password = str_replace("?",microtime(),$password);」で、「?」という文字をマイクロタイムの値に変換します。これは、パスワードリストファイルの先頭の文字列「<?php」と最後の文字列「?>」を入力されても、パスワードとして認識しないようにするための措置です。他にも方法はあると思いますが、この方法が面白そうなので、これを採用しました。
「$password = str_replace("\r","",$password);」「$password = str_replace("\n","",$password);」は、パスワードリストファイルの各行の後にある改行コードを除去するためのものです。この改行コードという目に見えない文字も配列に格納されるので、この改行コードを消さないと送信されたパスワードと一致しません。
その他の部分は、これまでの記述とほぼ同じです。
念のため、パスワード入力ページのソースも示しておきましょう。
[ソース]usrpwd1.html
サイト内に鍵付のページが少ない場合には、ページのそれぞれにパスワードを埋め込む形も悪くはないと思いますが、閲覧制限をかけたいページが多い場合には、ページを作成する際も、また、パスワードの登録、変更、削除の際も面倒です。パスワード用のファイルを1つ作成しておけば、いろいろなページでこれを読み込んで、閲覧させるかさせないか判断させることができます。
MySQLやSQLiteなどのデータベースを利用する方法もありますが、レンタルサーバーによっては、これらのデータベースを利用できないものがあります。一般のファイルでもユーザー管理程度なら可能なので、まずはデータベースを利用しない方法で考えることにしましょう。
次のようなパスワードのリストのファイルを作成します。
[ソース]usrpwd1_list.php
<?php
a
b
c
d
e
f
g
h
?>
ファイルを置くディレクトリが、一般ユーザーがアクセスできないところにあれば、普通のテキストファイルでもいいのでしょうが、外部からアクセスできるディレクトリに置かざるをえない場合には、一般のテキストファイルでは問題があります。万一、そのテキストファイルのパスがわかってしまったら、その内容がブラウザで見えてしまうからです。
ブラウザから見えないようにするには、PHPファイルにすればいいのではないかと考えました。
(これでセキュリティ的に安全かと言われると、初心者の私としては自信はありません。けれども、少なくとも私は、PHPファイルの内容を外部から覗く方法は知りません。セキュリティについては、自分でしっかり勉強しなければならない分野であり、他人の言うことをそのまま信じてはいけないと思います。念のため。)
そこで、ファイル名の拡張子を「.php」とし、記述の最初の行を「<?php」、最後の行を「?>」として、その間に1行ずつパスワードを書き込みました。ブラウザでこのファイルにアクセスしたら、何も表示されません。ブラウザの表示でソースも確かめました。ここも何も表示されません。OKということにしました。
次に、これを読み込むPHPファイルのソースを示します。
[ソース]usrpwd1.php
<?php
header("Pragma: no-cache");
header("Cache-Control: no-store, no-cache, must-revalidate");
$line=file("usrpwd1_list.php");
foreach($line as $password){
$password = str_replace("?",microtime(),$password);
$password = str_replace("\r","",$password);
$password = str_replace("\n","",$password);
if($password==$_POST["pwd"]){
$condition=1;
}
}
if($condition!=1){
header("Location:usrpwd1.html");
}
?>
<html>
<head>
<title>ユーザーパスワード1:file</title>
</head>
<body>
$condition=<?= $condition; ?><br>
$_POST["pwd"]=<?= $_POST["pwd"]; ?><br>
</body>
</html>
「$line=file("usrpwd1_list.php");」で、パスワードリストのファイルを読み込んで配列に格納します。
「foreach($line as $password)」で、配列から1つずつ取り出し、その値を$passwordに入れます。
「$password = str_replace("?",microtime(),$password);」で、「?」という文字をマイクロタイムの値に変換します。これは、パスワードリストファイルの先頭の文字列「<?php」と最後の文字列「?>」を入力されても、パスワードとして認識しないようにするための措置です。他にも方法はあると思いますが、この方法が面白そうなので、これを採用しました。
「$password = str_replace("\r","",$password);」「$password = str_replace("\n","",$password);」は、パスワードリストファイルの各行の後にある改行コードを除去するためのものです。この改行コードという目に見えない文字も配列に格納されるので、この改行コードを消さないと送信されたパスワードと一致しません。
その他の部分は、これまでの記述とほぼ同じです。
念のため、パスワード入力ページのソースも示しておきましょう。
[ソース]usrpwd1.html
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<meta http-equiv="Pragma" content="no-cache">
<title>ユーザーパスワード1:file-入力画面</title>
</head>
<body>
<form action='usrpwd1.php' method='post'>
パスワード:<input type='text' name="pwd">
<input type='submit' value="送信">
</form>
<p>「a,b,c,d,e,f,g,h」を送信すれば、目的のページが見れます。</p>
<p>「a,b,c,d,e,f,g,h」以外を送信すると、目的のページは見れず、
このパスワード送信ページに戻ってきます。</p>
<p>送信先のページでは、パスワードのリストのファイルを読み込み、
これをfile関数で配列に格納します。
この配列のそれぞれを送信された値と比較します。
その配列の値が送信されたデータと一致したときは「条件」を「真」とします。
一致しなければ、次の配列と比較します。
最後の配列までいっても値が一致しないときは「条件」に値がなく、「偽」ということになります。
「偽」の場合には、このパスワード送信ページに戻します。</p>
<hr>
</body>
</html>
PR