PEAR::AUTH別ページからログイン


他のサイトで回答いただけなかったので、こちらでお伺いします。(他サイト削除済み)

【サイト構成】
/index.php・・・・・・・ユーザID、パスワードの入力欄、入力値を/member/index.phpへsumitするボタンを含む。
/member/index.php・・・・以下のような典型的なコード

<?php
require_once("Auth.php");
function loginFunction($usr, $status){
require_once("loginForm.php");
}

$params = array(
"dsn" => "mysqli://pear:pass@localhost/pear",
"table" => "auth",
"usernamecol" => "username",
"passwordcol" => "password");

$myAuth = new Auth("DB", $params, "loginFunction");
$myAuth -> start();

if($myAuth -> getAuth()){
print("認証済です。");
}
?>

【思わぬ動き】
一度、正しくログインしてから、戻るボタンで/index.phpに戻り、その他のユーザIDを入力してsubmitボタンを押すと、パスワードが空にも関わらず、その他のユーザIDとして認証されてしまう。

【質問】
■authクラスは、他のページのsubmitボタンによってログインしてはいけないといったルールがあるのでしょうか?
■こうなってしまうのはなぜでしょうか?
■auth.phpをどのように加工すれば、上記2回目の動作でログインさせないことができるのでしょうか?

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2007/06/23 12:30:04
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答1件)

id:tobeoscontinue No.1

回答回数220ベストアンサー獲得回数59

ポイント60pt

>authクラスは、他のページのsubmitボタンによってログインしてはいけないといったルールがあるのでしょうか?

何処から来たかをチェックする意味がないと思うのでそんなことはないと思うのですが

http://www.phpbook.jp/pear/pear_auth/index2.html

ここでは"1つ目の規則はフォームの送信先は自分自身であること"と書かれています。PEAR:AUTHのマニュアルではそのような規則を見付けることができませんでしたが。


>こうなってしまうのはなぜでしょうか?

Authではセッション管理をしています。一度認証してしまうとセッション情報があればもう認証しているものとして調べないためと思います。


>auth.phpをどのように加工すれば、上記2回目の動作でログインさせないことができるのでしょうか?

$_POST['username']か$_POST['password']が設定されている場合は無条件に再度認証するようにすればいいと思います。

そのため一度logout()してからstart()します。

$myAuth = new Auth("DB", $params, "loginFunction");
if (isset($_POST['username']) || isset($_POST['password']))
  $myAuth -> logout();
$myAuth -> start();

/member/index.phpがログイン時だけなら無条件にlogout()でもいいでしょう。

id:ibun08

"1つ目の規則はフォームの送信先は自分自身であること"

立ち読みした書籍にもそんなことが書かれていました。smartyのようなテンプレートエンジンには最適ってことなんですかねー

logout()はひとつの案ですね。実際に、思わぬ動きがなくなりました。ただ、贅沢を言うと、ブラウザの「戻る」「進む」で既に表示されなくなるし、ページのアクセス毎にDBアクセスが発生してしまうんですよね。

しょうがないのかな。

2007/06/16 20:19:38

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません