0

login.phpという名前のファイル内に次のPHPスクリプトがあります

<?php
$ref = $_SERVER['HTTP_REFERER'];
if ($ref == 'http://example.com/dir/invalid.php' || $ref == 'http://www.example.com /dir/invalid.php') {
echo '
     <div id="invalid">
         TESTTESTTESTTESTTESTTESTTESTTEST
     </div>
    ';
}
?>

意図的にinvalid.phpページ(header()を使用してlogin.phpにリダイレクトする)に移動しましたが、このdivは表示されません。リファラーが実際にはinvalid.phpでないことと関係がありますか、それともスクリプトに問題がありますか?

ありがとう

4

1 に答える 1

1

あなたが思っているようなものではないと思いHTTP_REFERERます。つまり、ユーザーが現在のページへのリンクをたどった元のページです。ただし、この値を正しく報告するためにユーザーのブラウザーに依存しているため、非常に信頼性が低くなります。

あなたが必要だと思ったオプションを提案しますが、私が考えることができる唯一のものは本当に意味をなさないかもしれません...(URLが現在のスクリプトではないURLと一致するかどうかを確認しています)...だから私はそうします何をしようとしているのか見えません。


あなたが達成したいことをするためのいくつかの方法を約束したように:

まず、私はこのソリューションがまったく好きではなく、本当に醜いと考えていますが、それはあなたがやろうとしていることに最も近いものです.

無効な.php

require 'login.php'; // we include the file instead of referring to it

login.php

if ($_SERVER['SCRIPT_NAME'] == 'invalid.php')
{
    // do whatever
}

あなたがユーザーのために行ったことと私がユーザーのために行ったことの主な違いは、ここの URL バーが、あなたがどこかではなく、invalid.php にいることを示すことです。これは、更新してもメッセージが消えないことも意味します。

私の意見では、より良い解決策は次のとおりです。

ユーザーをログインさせるスクリプトで(データベースとすべてをチェックします):

if (!valid_login()) // pseudo-code, obviously
{
    $_SESSION['invalid_login'] = true;
    header('Location: login.php');
    // previously, we had something like this instead of the two lines above:
    // header('Location: invalid.php');
}

login.php で

if (isset($_SESSION['invalid_login']) && $_SESSION['invalid_login'])
{
    $_SESSION['invalid_login'] = false;

    // do whatever
}

もちろん、これは、これらの両方のファイルでセッションを開始するなど、適切なセッション機能を使用して行う必要があります。セッション変数を使用する代わりに、ファイルをインクルードして通常の変数を使用するか、ヘッダー リクエストを介して GET 変数を送信することもできますが、どちらの解決策にも問題があります。更新してもメッセージが消えないという問題です。ただし、コードを上記の 2 つの最上位ファイルからlogin.php(まだ存在しない場合、実際にどのファイルかわかりません...) に移動する場合は、セッション変数の代わりに通常の変数をもう一度使用できます。そして、さわやかにそれがなくなる解決策があります。この場合、ビジネス ロジックとプレゼンテーションでファイルがごちゃごちゃしていると主張するかもしれませんが、それに対する解決策があります (別のファイルに保存して、login.php、htmlを別のファイルに移動し、そのファイルlogin.phpまたはその両方を含めます。

于 2012-10-29T22:50:51.020 に答える