誰かのために構築しているサイトにユーザーがログインしたままにしておくのに問題があります。ログインに使用するアカウントに関係なく、意図したとおりに機能しますが、機能するかどうかを人々に尋ねると、答えは満場一致でノーです. 家庭内の他のマシンでさえログインできません。すべてのページに含まれるコードは次のとおりです。
//maintain session
session_start();
//"renew" session for 3 more days
ini_set('session.cookie_lifetime', 60*60*24*3);
ini_set('session.gc_maxlifetime', 60*60*24*3);
//check if session data corresponds to data in SQL
if(isset($_SESSION["username"])
&& isset($_SESSION["password"])
&& isset($_SESSION["authkey"])) {
$verifyuser = $db->prepare("
SELECT *
FROM users
WHERE username = :user
AND password = :password
AND authkey = :authkey
");
$verifyuser->execute(array(
':user' => $_SESSION["username"],
':password' => $_SESSION["password"],
':authkey' => $_SESSION["authkey"]));
//if use doesn't exist, rowCount() will be 0
if($verifyuser->rowCount() != 1) {
session_destroy();
}
}
//if IP stored in session doesn't match current IP, kill session
if(isset($_SESSION['ip'])){
if($_SESSION['ip'] != $_SERVER['REMOTE_ADDR']) {
session_destroy();
}
}
ログインページは正しく動作しているように見えます (ログインが成功したことを示すログインサブミットページのインタースティシャルが表示されます) が、とにかく下にあります。
//posted from login.php
$username = $_POST["name"];
$password = $_POST["pass"];
//check SQL for user
$grabb = $db->prepare("
SELECT username
FROM users
WHERE username = :username
");
$grabb->execute(array(
':username' => $username));
if($grabb->rowCount() == 1) {
$grabusername = $grabb->fetchColumn();
$pahash = crypt($password, $grabusername);
}
$logcheck = $db->prepare("
SELECT *
FROM users
WHERE username = :username
AND password = :pahash
");
$logcheck->execute(array(
':username' => $username,
':pahash' => $pahash));
//if everything is golden, initialize pertinent info into session
if ($logcheck->rowCount()==1) {
$_SESSION["username"] = $username;
$_SESSION["password"] = $pahash;
$_SESSION["authkey"] = $logcheck->fetchColumn(12);
$_SESSION['ip'] = $_SERVER['REMOTE_ADDR'];
}
なぜこのローカル マシンで機能するのか理解できませんが、他の誰も機能しません。他のすべての人にとっては、ログインが成功したと表示され、リダイレクト時にログインしていないと表示されます。私以外の人のためにセッションが保存されておらず、その理由がわかりません.
サイトのライブ バージョンは、ここで見ることができます。テスト用にダミーアカウント (a / a) を設定しました。
コードの一部をコメントアウトしてみました (コードの最初のブロックの IP チェック、および php.ini 行の後のコードの最初のブロック全体など) が、何もしないようです。