1

私が所属しているロボット工学チームの PHP ログイン システムを作成しています。ログインシステムの流れは以下の通りです。

  1. インデックス ページで、$_SESSION['log_info'] が「true」に設定されているかどうかを確認し、設定されている場合はメンバーのコンテンツを表示します。false の場合、ログイン ページが表示されます。
  2. 次に、ログイン後、データベースに接続し、ユーザーの資格情報が一致するかどうかなどを確認する login.php に移動します。$_SESSION['log_info'] を login.php ページのイベントに対応する値の範囲に保存します。
  3. 次に、$_SESSION['log_info'] を読み取るインデックス ページにリダイレクトし (したがって、login.php ページのステータスを認識します)、さまざまな値に対してアクションを実行します。

私の問題は、セッション変数が login.php ページのリダイレクトを通過していないことです。それらはヌルです。

私がチェックしたこととそれが機能していること:

  • それらが設定されていることを確認しましたが、設定されています。(login.php ページでエコーできます。)
  • また、ヘッダーステートメントの移動先を変更でき、すべて正常に機能するため、リダイレクトが機能することも知っています。
  • また、PHP セッション Cookie は試練の間ずっと一定のままであることも知っているので、そうではありません。
  • 私は sessions_start(); を持っています。すべての私のページで。

2 つのページのコードは次のとおりです。

index.php

<?php // this is first line of page
session_start();

// If user is not logged in, sets $log_info == 'false'
if (!isset($_SESSION['log_info']) || $_SESSION['log_info'] == '' || $_SESSION['log_info'] == '0') { $_SESSION['log_info'] = 'false'; }

function get_banner() {
  // Switch statement for all cases of $log_info... Usually displays banner to user...
  switch ($_SESSION['log_info']) {
    case 'true':
      echo '<div class="banner">You are logged in!</div>';
      $_SESSION['log_info'] = '';
      break;

    case 'false':
      echo '<div class="banner">Please login below.</div>';
      $_SESSION['log_info'] = '';
      break;

    case 'error':
      echo '<div class="banner">Your username or password do not match.</div>';
      $_SESSION['log_info'] = '';
      break;

    case 'acc_fail_username':
      echo '<div class="banner"><b>Account creation failed:</b><br/>Your selected username already exists. Please pick a different one.</div>';
      $_SESSION['log_info'] = '';
      break;

    case 'acc_fail_parm':
      echo '<div class="banner"><b>Account creation failed:</b><br/>One or more of your entry fields were invalid. Please try again.</div>';
      $_SESSION['log_info'] = '';
      break;

    case 'acc_success':
      echo '<div class="banner">Your account was successfully created! Login below.</div>';
      $_SESSION['log_info'] = '';
      break;

    default:
      $_SESSION['log_info'] = '';
      //die('Something went wrong internally. Please stay calm while we fix it');
  }
}

?>

<?php get_banner(); ?>

<b>Login:</b>

<form action="login.php" method="post">
Username: <input type="text" name="username"><br/>
Password: <input type="password" name="password"><br/>
<input type="submit">
</form>

login.php

<?php // this is first line of page
session_start();

// Connect and verify connection
$con = @mysqli_connect($host, $username, $password, $dbname);

$username = $_POST['username'];
$password = $_POST['password'];

$query = mysqli_query($con, "SELECT * FROM FRC4096users WHERE     username='".$username."'");
$row = mysqli_fetch_array($query);

$salt = $row['salt'];

if ($row['passwordhash'] === hash('sha512', $password . $salt)) {
  $salt = hash('sha512', rand());
  mysqli_query($con, "UPDATE users SET salt='". $salt ."' WHERE     username='".$username."'");  // Resets salt on login for security
  mysqli_query($con, "UPDATE users SET passwordhash='". hash('sha512', $password .     $salt) ."' WHERE username='".$username."'");  // Resets salt on login for security
  $_SESSION['log_info'] = 'true';
  session_write_close();
  header('Location: /');
  die();
} else {
  $_SESSION['log_info'] = 'error';
  session_write_close();
  header('Location: /');
  die();
}

?>
4

2 に答える 2

0

こんなことしたらどうしよう……。

<?php // this is first line of page
  session_start();

  if (!isset($_SESSION['log_info']){  header('Location: /login.php');die();} 
  else {

 switch ($_SESSION['log_info']) {
  case 'true': echo '<div class="banner">You are logged in!</div>';
    unset($_SESSION['log_info']);
    break;

  case 'false':
    echo '<div class="banner">Please login below.</div>';
    unset($_SESSION['log_info']);
    break;

case 'error':
  echo '<div class="banner">Your username or password do not match.</div>';
  unset($_SESSION['log_info']);
  break;

case 'acc_fail_username':
  echo '<div class="banner"><b>Account creation failed:</b><br/>Your selected username already exists. Please pick a different one.</div>';
  $_SESSION['log_info'] = '';
  break;

case 'acc_fail_parm':
  echo '<div class="banner"><b>Account creation failed:</b><br/>One or more of your entry fields were invalid. Please try again.</div>';
  unset($_SESSION['log_info']);
  break;

case 'acc_success':
  echo '<div class="banner">Your account was successfully created! Login below.</div>';
  unset($_SESSION['log_info']);
  break;

default:
  unset($_SESSION['log_info']);
  break;
  }
}
?>


 <b>Login:</b>

 <form action="login.php" method="post">
 Username: <input type="text" name="username"><br/>
 Password: <input type="password" name="password"><br/>
 <input type="submit">
 </form>

次に、ログインページで、これを...上部に....残りは同じです....

<?php // this is first line of page
   session_start();
   session_unset();
 //rest of code
于 2013-06-27T02:32:07.637 に答える
0

いくつかのことを試してみてください:

  1. すべてのドメインが同じかどうかを確認します。ドメインを変更すると、セッションが変更されます。
  2. セッションが保存されている一時フォルダーを見てください。何かがファイルからデータを消去していないか監視してみてください。
  3. プロジェクト ファイルを検索して、session_destroy()気付いていない可能性のあるものを探します。
  4. session_write_close()これは解析の最後に自動的に実行され、スクリプトが短いため、ファイルから削除します。
  5. error_reporting(E_ALL);セッションを開始する前に、を使用してエラー報告レベルを変更してみてください。
  6. おそらく、print_r($_SESSION)すべてのページの a は、データがどこに消えていくのかを見つけるのに役立ちます。

これは、エラーがどこにあるかを検出するのに役立ちます。

幸運を!

于 2013-06-27T02:28:51.977 に答える