0

誰かのために構築しているサイトにユーザーがログインしたままにしておくのに問題があります。ログインに使用するアカウントに関係なく、意図したとおりに機能しますが、機能するかどうかを人々に尋ねると、答えは満場一致でノーです. 家庭内の他のマシンでさえログインできません。すべてのページに含まれるコードは次のとおりです。

//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 行の後のコードの最初のブロック全体など) が、何もしないようです。

4

1 に答える 1

1

問題<!DOCTYPE html>はそれ以前session_start();のものであり、その結果、ページ間でセッション データが維持されませんでした。

于 2013-10-03T05:41:32.217 に答える