多くの場合、特定の Web ページを保護する必要があります。典型的な例は、フロントエンドの閲覧ページとバックエンドの管理ページのセキュリティです。これは、WEB 上で最も一般的に使用されるページ セキュリティ モードでもあります。私も PHP4 で小規模な書籍管理システムを開発したときに、このセキュリティ問題に遭遇しました。そこで、PHP4 の新機能であるセッションについて考えてみました。
要件の目的: 同一サイト上で、非特権ユーザー、一般許可ユーザー、スーパーユーザーが異なるページを表示および使用できます。
実装方法: 保護するページにさまざまなレベルのセキュリティ検査テンプレートを含めます。
注:
1 > ユーザーのブラウザが Cookie を使用せずに保護されたページを閲覧できないようにするため (セッションはデフォルトでクライアント Cookie を使用します)。
2 > 許可の盗難を防ぐため。 (PHP 4 のセッションのデフォルトの存続期間は、セッションが確立されてからブラウザが閉じられるまでです。)
使用方法:
1 > 一般的な保護が必要なページのコードの先頭に include ("security2.PHP") を追加します。
2 > 特別な保護が必要なページのコードの先頭に include ("secturity1.PHP") と include ("secturity2.php") を追加します。
(すべてのファイルが同じフォルダー内にあると仮定します)
プログラムコードと詳しい説明:
security1.PHP 特別なユーザー ページ保護テンプレート
security2.PHP 一般ユーザーページ保護テンプレート
login2.PHP ユーザーログインページ
まず、login2.PHP (ユーザーログインページ) のコードを見てみましょう:
PHP
session_register("user");#ユーザー名変数を追加
session_register("password"); #パスワード変数を追加します
session_register("tmLast"); #時間変数を追加
if($user==""){#初めてのログインかどうかを判断します
$error="名前を選択してパスワードを入力してください!";
}
$tmLast=date("U"); #ログイン時刻を記録
if($user1)
$user=trim($user1); #ユーザー名を記録します (user1 変数が引用されているのはなぜですか? 読者は自分で考えてください。)
$password=trim($password1); #パスワードを記録します
if($user1&&$password1){
if($password1==888){ #ログインパスワードがデフォルトのパスワード 888 であるかどうかを確認します。 PHP プログラムを終了します
$sid="PHPSESSID=".session_id(); #現在のセッションの ID 番号を保存します
$warning="あなたのパスワードはデフォルトのパスワード 888 のままです。変更してください。";
header("Location:changePassword.PHP?$sid&warning=$warning"); #警告パラメータの警告をchangePassword.phpページに渡します
exit(); #PHP プログラムを直ちに終了します
}
if(strto lower($user)=="root"){ #ログインしているユーザーがスーパーユーザーであるかどうかを判断し、ユーザーを自分で拡張できます
$fileName="backend_index.PHP";
}
他{
if(!$fileName) #ログインページに入る前のページが保護されたページかどうかを判断します
$fileName="インデックス.PHP";
}
$sid="PHPSESSID=".session_id(); #現在のセッションの ID 番号を保存します
header("Location:$fileName?$sid); #ログインに成功し、指定されたページに入り、ユーザーが Cookie を使用せずにセッション値を読み取れないように、現在のセッションの ID 番号を渡します
exit(); #PHP プログラムをすぐに終了します
}
?>
PHP
echo "$error"; #ログイン プロンプトを表示
?>
PHP
include("class/dbclass.inc"); #dbclass.inc クラスを呼び出します。使い方は MySQL.inc クラスと同じです
$q=newDB_Sql; #新しいオブジェクトを定義します
$q->connect($Host,$Database,$User,$Password); #MySQL データベースに接続します
$query="selectchrUserName,chrFirstName,chrLastName"
「ユーザーから」。
「wherechrFirstName!=」
"orderbychr名";
$q->query($query); #SQL ステートメントを実行
エコー""
while($q->next_record()){ #データベースから一般ユーザーを呼び出す
if($user==$q->f(0)) #現在のユーザーであるかどうかを判断します
$select="selected"; #現在のユーザーの場合は、デフォルト値に設定します
それ以外
$select="";
echo""andchrPasswd='$password'";
$q->クエリ($クエリ)
if(!$q->num_rows()){ #一致するパスワードを持つユーザーが見つかったかどうかを判断します
$error=urlencode("パスワードが間違っています。または権限がありません。");
header("Location:login2.PHP?fileName=$fileName&error=$error&user=$user"); #パスワードエラーのログインページにジャンプします
}
他{
$sid="PHPSESSID=".session_id();
$q->next_record();
$USERID=$q->f(idUser); #認証済みユーザーの ID 番号を将来の使用のために保存します
}
?>
security1.PHP (特別なユーザー ページ保護テンプレート):
PHP
session_register("user"); #説明は上記と同じです
$privilege="root,macro,jackie"; #スーパー ユーザーのリストを「,」で区切って設定します
$pieces=explode(",",$privilege); #単一のスーパー ユーザー リストを取得します
for($i=0;$i if(strto lower($user)==$pieces[$i]){ #スーパーユーザーかどうかを判断する
$hASPrivilege=1;
Break; #判定ループから抜け出す
}
}
if(!$hASPrivilege){
if($fileName=="")
$ファイル名=$PHP_SELF
$error=urlencode("このページを閲覧する権限がありません!");
header("場所:login2.PHP?fileName=$fileName&error=$error&id=$id");
exit(); #不正ユーザーのログインページにジャンプします
}
?>