6

ユーザーがログインしているかどうかを確認するPHPスクリプトを作成してcheck.phpいます。ユーザーは1人しかいないため、パスワードはphpコードに直接記述されています。はcheck.php、関連するすべてのページの上部 (1 行目) の行に含まれています<? include "check.php"; ?>

コード

パスワードとドメイン名を削除しました。それとは別に、以下は私のコードです。ここでのポイントは、ログイン ページでパスワードを入力し、POST でこのスクリプトに送信することです。

パスワードが正しいxxxの場合、セッションlogintrue.

パスワードが正しくなく、設定されている場合、つまりユーザーが何か間違って入力したことを意味し、既存のセッションは で終了し、ユーザーsession_destroy()がログアウトしたことを意味します。

彼がページに到達してもログインしていない場合、セッションloginは false または未設定である必要があります。これは、} elseif(!($_SESSION['login'])) {が使用されることを意味します。

最後に、ログアウトボタンをクリックすると、次の URL のスクリプトに送信されますcheck.php?logout=true。は最後の elseif ステートメントでlogout=trueキャッチされ、セッションはそこで終了する必要があります。$_GET

<?
ob_start();
session_start();


if($_POST['password'] == 'xxx') {   // Correct password

    $_SESSION['login'] = true;
    header("Location: http://www.url.com/administration/index.php");

} elseif (isset($_POST['password'])) {  // Wrong password

    session_destroy();
    header("Location: http://www.url.com/administration/login.php?true");

} elseif(!($_SESSION['login'])) {   // Check at every page

    header("Location: http://www.url.com/administration/login.php");

} elseif($_GET['logout']) { // Log out

    session_destroy();
    header("Location: http://www.url.com/");

}
ob_flush();
?>

問題

すべての if ステートメントで、リダイレクトを試みます。を使用してheader("Location:...)いますが、いずれの場合も機能しません。headerコマンドは、仕様に従ってブラウザーに送信される最初の要求でなければならないため、ここで説明されているようにob_start();andを使用しました。これらの有無にかかわらず機能しません。ob_flush();

また、コンテンツを保存しないセッションにも問題があります。trueなんらかの理由でセッションに保存できません。コードに失敗する問題はありますか?

テストとして、すべての/ステートメントechoにコマンドを記述しようとしました。そのことから、スクリプトは常に 3 番目のステートメント (. を持つステートメント) に入ることがわかりました。ififelse!($_SESSION['login'])

質問

ここまでは順調ですね。これは、スクリプトがセッションが設定されていないことを検出できることを示しています。
残る2つの問題は次のとおりです。

  • リダイレクトが発生しないため、ステートメントのリダイレクトが機能しない理由
  • そもそもセッションを設定できない理由。

アドバイスをいただければ幸いです。


更新 1

何が起こるか (そして何が起こらないか) を明確にするために、いくつかechoの を別の場所に入れました。いくつかの追加の s を含む上記のコードのこのスニペットecho:

...
echo "Input: " . $_POST['password'];
echo "<br>Session before: " . $_SESSION['login'];

if($_POST['password'] == 'xxxx') {  // Correct password

    $_SESSION['login'] = true;
    header("Location: http://www.url.com/administration/index.php");
    echo "<br>Session after: " . $_SESSION['login'];
    echo "<br>The first if works";

} ...

次の出力を返します。

Input: xxxx
Session before:
Session after: 1
The first if works

(xxxx はパスワードです。正しいです。)

これは、ログインしている状況です。パスワードを書き込んで、 に送信されましたcheck.php

ifしたがって、ここで、想定どおりに最初にアクセスすることがわかります。trueまた、セッションは(または)に正しく設定されてい1ます。ページを更新すると、セッションはもう設定されていません。そうではないでしょうか?

そして、headerリダイレクトは明らかに何もしません。


更新 2

したがって、以下の@EmilFからの回答のおかげで、画面に印刷できるセッションIDが、echo session_id();ページシフトまたはページ更新ごとに新しい乱数に見えることがわかりました。新しいセッションIDが別の場所を指しているため、セッションに保存されたデータが忘れられているように見えます。

以下を使用して:

<?
session_id('cutckilc16fm3h66k1amrrls96');
session_start();
...

cutckilc16fm3h66k1amrrls96は単なる乱数であり、セッション ID は固定されており、保存されたデータはページの更新後に再度取得できるようになりました。これは非常にうまく機能します。まだ少し奇妙ですが、必要です。

これで、ヘッダーリダイレクトのみが機能する必要があります...

うーん、これは遮断された何かのようなにおいがします。セッションとヘッダーの機能が変更されました。おそらく、これはホストからの PHP 設定です。ヘッダー リクエストをブロックするもの。

つづく...

更新 3 - 解決済み

以下の私の答えを見てください。

ファイルを別のコーディング形式 (ANSI から UTF-8 など) に変更すると、ファイルの先頭に奇妙なシンボルが作成されます。作成されたシンボルはで、自分のエディターでは表示できません。それらは php スクリプトの前にあるため、 と が適切に機能するのをheader防ぎsession_start()ます。なぜそれらが作成されたのか、私にはまだ謎があります。

4

4 に答える 4

3

わかりました、ここでデバッグできるものをすべてリストアップしましょう。また、既に行ったことにも言及します (他の人が読むことができるように):

  • HTTPヘッダーのようなものがインストールされていますか? 次に、Location:ヘッダーがブラウザに送信されているかどうかを確認できます。
  • エラーメッセージは表示されないと思いますよね?設定しましたerror_reporting(E_ALL);か?
  • 配列var_dump()に対して実行してみてください。$_POST
  • また、ブラウザで Cookie をチェックするものはありますか? 私は通常、メニューCookie -> show cookie informationを持つFirefox web-developer ツールバー プラグインを使用します。そこにクッキーが表示されます(ログイン後)。そうでない場合は、URL にセッション ID に関する情報を含める必要があります (次のようになります: )。そうしないと、PHP はセッションを見つけることができません。これは、どのセッションがユーザーに属しているかがわからないためです。PHPSESSID?PHPSESSID=514515ca274866b9f0b5b2520b6fcbb4

これで問題が解決しない場合は、Cookie が設定されているかどうかを確認します。

  • 再度ヘッダー プラグインを開き、ログインを実行します。サーバーが Cookie を送信しているかどうかを確認します。これはコマンドで行う必要がありますSet-Cookie。次のようになります。Set-Cookie: PHPSESSID=514515ca274866b9f0b5b2520b6fcbb4; path=/
  • サーバーが Cookie を設定しない場合は、 の設定を確認してくださいphp.ini。PHP が Cookie を使用できるように、または許可するように設定する必要がある設定session.use_cookies = 1が必要です。1On
  • サーバーが Cookie を設定しても、ブラウザが許可しない場合は、ブラウザの Cookie のオプションを確認してください。php.iniの設定も確認してくださいsession.use_only_cookies = 0。これが設定されて1いる場合、ブラウザが Cookie を受け入れない場合に PHP が URL を使用することを禁止します。これは通常、セキュリティ上の理由から禁止されています。なぜなら、URL を友人にコピーすると、これらの友人がログイン セッションを引き継ぐからです ;)0デバッグ目的で設定するだけです。
  • var_dump()の戻り値session_start()。PHP がセッションを正しく開始できなかった場合は false を返します。
于 2012-07-14T20:19:36.463 に答える
2

ここで謎解き: バイトオーダーマーク

ここに画像の説明を入力

あなたが見つける最良の答え:

https://stackoverflow.com/a/8028987/424004

于 2012-07-15T16:00:49.973 に答える
1

session_id() で PHPSESSID を出力してみてください。更新を続けると、同じ出力が得られますか?

ID を設定しようとしていない場合: session_id('cutckilc16fm3h66k1amrrls96')

http://php.net/manual/en/function.session-id.php

これで動作するはずですが、すべてのユーザーに対して同じセッションが使用されます。

問題は次のようなものである可能性があります: PHP セッション データが保存されない

于 2012-07-14T22:27:22.753 に答える
0

何日も何日もかけてテストし、読み、質問し、この質問について参加者の多くの助けを借りて -あなたの努力に感謝します! -私はゆっくりと、この問題に対するかなり不思議な解決策にたどり着きました。
見つけた解決策ですが、まだ説明がありません...

そのため、Update 2 で説明したように、@EmilF からの回答から、セッション ID が常に変化していることがわかりました。そのとき、サーバー/ホストの問題を疑うことが考えられました。ホストに連絡しました-one.com-最初は私のように理解できませんでした。なぜうまくいかなかったのですか。

check.phpしかし、彼は私に、ファイルの先頭にかなり奇妙な記号がいくつかあると言いました。自分のエディターではそれらを見ることができませんでした。one.com が提供するブラウザベースの FileManager ソフトウェアを介してファイルにアクセスするまで、それらは表示されませんでした。

問題と解決策

ファイルの先頭は次のようになっています。

<?
ob_start();
session_start();


if($_POST['password'] == 'xxx') {   // Correct password

    $_SESSION['login'] = true;
...

最初に奇妙なシンボルが表示されます。私が言ったように、それら私自身のエディター Notepad++ でも通常のメモ帳でも見えませんでした。ファイルを友人に送ってチェックしてもらいましたが、友人のエディタである Coda でも見ることができませんでした。

もちろん、これらのシンボルはブラウザへの出力として機能します。session_start()したがって、これはと の前に発生するブラウザへのリクエストheader(Location:...です。これらの 2 つのコマンドは、ブラウザーの要求よりも前に実行する必要があるため、この場合、シンボルが存在する場合は機能しません。

セッションとheaderコマンドは、シンボルが削除された今では完璧に機能します。

まだ説明不足…

なぜそこにいるのかはわかりませんが、さらにテストを重ねた結果、どうやってそこにたどり着いたのかがわかりました。

Notepad++ では、メニューでコーディング形式を変更できます。fx ANSI から UTF-8 に変更すると、記号が表示されます。通常のメモ帳では、「名前を付けて保存」ウィンドウのオプションとして UTF-8 として保存できます。この場合も記号が表示されます。

いずれにせよ、サーバーからファイルを直接取得するブラウザーベースのエディターでコードを表示すると、シンボルしか表示されません。そして、作成されるのは常にエディターに関係ありません

これについての説明はありません。これは、別の SO の質問に適したトピックかもしれません。

私を助けようとしたすべての人に感謝します。これが答えなので、ここで質問に答えています。しかし、すべてのヘルプとデバッグのトリックは高く評価され、非常に役に立ちました。

どうもありがとうございました。皆様、良い夏をお過ごしください。

于 2012-07-15T15:50:40.293 に答える