2009-04-09 17 views
0

ウェブサイトの各ページにログインフォームがあり、どこからでもログインできます。私はlogin.phpファイルをフォームから参照しています( 'action'を使用して)。PHPログインシステムの問題ページからページへのエラーの送信

私は$_SERVER['HTTP_REFERER']を使用して、ログインしたときとログアウトしたときと同じページにユーザーをリダイレクトします。

ログインに問題があった場合、ログインしようとしている同じページにどのようにエラーを送信できますか?私はこのように、$_GETを使用してエラーを送信しようとしている:

// process the script only if the form has been submitted 
if (array_key_exists('login', $_POST)) { 
    // Login code goes here... 

    // If there was a problem, destroy the session and prepare error message 
    else { 
    $_SESSION = array(); 
    session_destroy(); 
    header('Location: '.$_SERVER['HTTP_REFERER'].'?error'); 
    exit; 
} 

しかし、問題は、ウェブサイト内のページの多くは、このdetails.php?mid=0172495似ているということです。彼らはすでに$_GETメソッドからの情報を受け取り、セキュリティ上の理由から別の$_GETメソッドを使用することはできません...

どうして私はエラーに合格することができますか? おかげで...

+0

$ _SERVER ['HTTP_REFERER']を使用すると、クライアントがリファラーをブロックできるので、悪い考えです。代わりに$ _SERVER ['PHP_SELF']を使用することを検討してください。 – Powerlord

+0

PHP_SELFはログインスクリプトのアドレスを与え、彼はどこから来たのかを調べようとしています。一般的に正しい解決策は、$ _GET変数のアドレスをログインスクリプトに送信して、リファラーのブロック問題を回避することです。 –

答えて

0

「?」。存在する場合は、 '& error'をHTTP_REFERERに追加し、それにリダイレクトします。それ以外の場合は、HTTP_REFERERに '?error'を追加し、それにリダイレクトします。

+0

どうすればいいですか?私はPHPには本当に新しいです... – Jonathan

+0

header( '場所:'。$ _SERVER ['HTTP_REFERER'](strpos($ _ SERVER ['HTTP_REFERER']、 '?')!== FALSE? '&error': '?エラー')); – Matt

0

は、私は正確にあなたが「セキュリティ上の理由から、私は別の$_GETメソッドを使用傾ける」によって何を意味するかわからないんだけど、クエリ文字列に何かが既に存在だという場合には、あなただけの別を追加する必要がありますそれを置き換えるのではなく、変数に置き換えてください。アドレスはdetails.php?mid=0172495ようであれば、それはちょうどdetails.phpだった場合、あなたはdetails.php?errorに送る一方で、あなたは、details.php?mid=0172495&errorに送信する必要がありますされ

。チャドバーチが言った...

をあなたがリダイレクトログインスクリプトでは、文字のHTTP_REFERER値をチェックしに追加する

+0

ログインスクリプトに$ _GET変数のアドレスを送信するにはどうすればいいですか? – Jonathan

2

すでにセッションを使用しているので、セッションを破棄した後、$ _SESSION ['error']または同様のセットを使用して新しいセッションを作成してください。あるいは、単にセッションを削除しないでくださいが、他のページですぐにチェックインできるエラーを設定してください。

+0

これは解決策ですが、あまりスケーラビリティがありません。 つまり、スクリプトが複数のサーバから提供されている場合、データベースを使用する独自のセッションハンドラを作成したり、複数のサーバで動作する他のメソッドを作成しない限り、セッションは機能しなくなります。 – Matt

+0

これは間違いなく、$ _GETとセッションはあるページから別のページにデータを渡す最も簡単な方法と思われますが、もっと堅牢な解決策が必要かもしれません。たぶん元のポスターが$ _GETを使うことができるというコメントに基づいています。 – Rob

+0

複数のサーバーで実行している場合は、複数のサーバー間でセッションを共有する必要があります。それ以外の場合は、セッション変数の目的を無効にします。 (memcachedセッションハンドラを調べる) –

0

必要な作業を行うもう1つの方法は、ログインフォームを持ち、同じページに投稿するだけのすべてのページにlogin.phpファイルを含めることです。したがって、リダイレクトはまったく必要ありません。

これはスケーラビリティと保守性に優れた解決策ではないかもしれませんが、単純です。それはすべてあなたが書いているアプリの種類に依存します。しかし、あなたはあなたがこれのように始めることができるようにあなたはPHPに新しいことを言っている。後でいつでも気軽に行くことができます...

関連する問題