0

所以这是我第一次使用 cookie,我在设置它们时遇到了一些麻烦。我认为我做的一切都是正确的(但你知道编程是怎样的)。无论如何,我正在创建一个登录系统,它将通过jquery.ajax调用validateLogin.js一个 php 脚本(autologin.php),通过另一个脚本(login.php)中的函数检查用户及其密码是否在数据库中,在login.php如果用户存在且密码相同,则设置 cookie 并autologin.php返回一些 json 数据,然后将更多 json 数据返回给原始jquery.ajax方法success函数。然后该success函数将重定向到userarea.html,其中 js 函数将自动加载用户数据,以便可以使用。这是通过另一个ajax调用完成的loaduserdata.jswhich 调用loaduserdata.phpwhich checks isset($_COOKIE['user'],然后根据发生的情况返回一些 json 数据。但是isset($_COOKIE['user']失败了,我在控制台或任何日志(php、mysql、apache)中都没有收到任何错误。所以我真的很难过。这是我的代码:

validateLogin.js

function validateLogin(){
  $(document).ready(function(){
    $("#loginform").submit(function(){
      $.ajax({
        type: "POST",
        url: "./php/autologin.php",
        data: {
          'login': $("#login").val(), 
          'password': $("#password").val()
        },
        dataType: "json",
        success:function(data){
          if(data.status == "success"){
            alert(data.message);
            window.location = "./userarea.html";
          } else if (data.status == "error"){
            alert(data.message);
          }
        },
        error:function(thrownError){
          console.log(thrownError);
        }
      }); 
      return false;
    });

  });
}

autologin.php

<?php

include './login.php';
$login = $_POST['login'];
$password = $_POST['password'];
$loginattempt = login($login, $password);
$loginattemptdata = json_decode($loginattempt);
if ($loginattemptdata->{'status'} === "success") {
  echo json_encode(array('status' => "success", 'user' => $loginattemptdata->{"user"}, 'message' => "Login Successful!"));
  die();
} else {
  echo json_encode(array('status' => "error", 'error' => "loginfailure", 'message' => $loginattemptdata->{"message"}));
  die();
}
?>

login.php

<?php
include './connect_to_mysql.php';

function login($log, $pass) {
  $link = connect_to_mysql();
  $linkdata = json_decode($link);
  if ($linkdata->{'status'} === "success") {
    $sqlquery = mysql_query("SELECT * FROM userdata WHERE login='$log' AND password='$pass'") or die(mysql_error());
    if (mysql_num_rows($sqlquery) == 1) {
      setcookie("user", $log, 86400, '/', 'localhost');
      return json_encode(array('status' => "success", 'message' => "Login Successful.", 'user' => $log));
      die();
    } else {
      return json_encode(array('status' => "error", 'error' => "loginfailure", 'message' => mysql_error()));
      die();
    }
  } else {
    return json_encode(array('status' => "error", 'error' => "connectionerror", 'message' => $linkdata->{'message'}));
    die();
  }
}

?>

loaduserdata.js

$(document).ready(function(){
  $.ajax({
    type:"POST",
    url:"./php/loaduserdata.php",
    success:function(data){
      if(data.status === "success"){
        alert(data.status);
        alert(data.user);
      } else if (data.status === "error"){
        alert(data.status);
        alert(data.message);
        window.location = "./index.html";
      }
    },
    error:function(thrownError){
      console.log(thrownError);
    }
  });
});

loaduserdata.php

<?php
if (isset($_COOKIE['user'])) {
  $user = $_COOKIE['user'];
  echo json_encode(array('status' => "success", 'message' => $user));
  die();
} else {
  echo json_encode(array('status' => "error", 'message' => "Please login before continuing."));
  die();
}
?>

从我读过的内容来看,您需要在设置 cookie 以使其可用于新脚本后刷新或重定向,我相信这就是我正在做的事情。任何帮助或方向将不胜感激。谢谢!

4

1 回答 1

1

依赖客户端 cookie 获取登录状态是一个坏主意。想象一下,如果用户使用随机(有效)用户名制作自己的 cookie,会发生什么?他无需密码即可访问您的系统。

您是否考虑过切换到基于 $_SESSION 的身份验证过程?

这个概念是为每个访问者分配一个唯一的 ID(会话 ID),该 ID 存储为 cookie 客户端。当访问者加载页面时,会传递 sessid cookie,php 从会话存储中加载它(如果您尚未配置会话,很可能是 /tmp/ 中的文件)。此文件反映在 $_SESSION 变量中,您可以在其中保存只能由相应会话 ID 访问的数据。因此,用户名或登录状态是在服务器端处理的,而不是在客户端处理的。

<?php
# login.php
include './connect_to_mysql.php';

function login($log, $pass) {
  $link = connect_to_mysql();
  $linkdata = json_decode($link);
  if ($linkdata->{'status'} === "success") {
    $sqlquery = mysql_query("SELECT * FROM userdata WHERE login='$log' AND password='$pass'") or die(mysql_error());
    if (mysql_num_rows($sqlquery) == 1) {
      session_start();
      $_SESSION['user'] = $log;
      return json_encode(array('status' => "success", 'message' => "Login Successful.", 'user' => $log));
    } else {
      return json_encode(array('status' => "error", 'error' => "loginfailure", 'message' => mysql_error()));
    }
  } else {
    return json_encode(array('status' => "error", 'error' => "connectionerror", 'message' => $linkdata->{'message'}));
  }
}
?>

更改: (1) 返回后丢弃 die()。他们永远不会被处决。(2) 通过 session_start() 和 $_SESSION['user'] = $log 保存到会话;而不是使用您自己的 cookie。

<?php
# loaduserdata.php
session_start();
if (isset($_SESSION['user'])) {
  $user = $_SESSION['user'];
  echo json_encode(array('status' => "success", 'message' => $user));
  die();
} else {
  echo json_encode(array('status' => "error", 'message' => "Please login before continuing."));
  die();
}
?>

更改:使用 session_start() 和 $_SESSION['user'] 而不是依赖客户端 cookie。

于 2012-06-17T20:45:37.357 回答