【问题标题】:AJAX script stopped remembering sessionAJAX 脚本停止记住会话
【发布时间】:2012-04-09 22:32:11
【问题描述】:

我不久前发布了this question。我已经用工作了大约 1 周的 AJAX 脚本更新了这个问题。基本上我可以使用 AJAX 脚本中的session_start(),然后我可以访问我需要的会话变​​量。

真的很奇怪,但是我是在周末之后进来的,今天早上这个脚本不再起作用了。很简单,这里:

<?php

session_start();

$ajax_connection = mysql_connect('10.X.X.X',$_SESSION['username'],$_SESSION['password']);

$result_set = array();

while ($result_set[] = mysql_fetch_assoc($results)){
    // do nothing
}

echo json_encode($results);

?>

上周这工作完美无缺,现在在我的错误日志中我收到了Undefined index: usernameUndefined index: password 警告。当然,MySQL 连接没有建立。所以这个脚本没有运行与原始连接相同的会话。我用error_log(session_id())检查了父页面的ID和AJAX脚本,果然不一样。当我重新加载页面并再次尝试时,页面和 AJAX 脚本的 ID 分别保持不变,但它们应该是相同的 ID,而不是 2 个不同的 ID。

无论如何,在运行了一个多星期之后,有没有人知道为什么这不再起作用了?

【问题讨论】:

  • 为什么要将 mysql 连接信息存储在会话变量中?
  • @N.B.好吧,因为它有效。我还能如何获得 AJAX 脚本的连接信息?
  • 是什么阻止您将包含数据库凭据的文件包含到您的 AJAX 脚本中?对于 10 000 个用户,您将使用相同的信息填写会话。这不是真的可行,是吗?显然,它也会给你带来问题。因此,这意味着一个糟糕的设计决策。我可以继续讨论它在共享主机等方面的不安全性。但我不会,将数据库信息存储在会话中只是一个糟糕的设计决定。
  • @N.B.谢谢您的帮助!要在 AJAX 脚本中包含 PHP 文件,您必须将该文件存储在 web 目录中,因此 web 用户可以访问该位置。我以为这是不安全的??我宁愿将此文件与数据库凭据一起存储在 Web 目录之外。我的印象是 AJAX 脚本无法访问 web 目录之外的文件。
  • 即使带有 db 凭据的文件可以通过 HTTP 获得,这有什么关系?如果您没有回显数据库信息,那么访问它的人将毫无用处。他们将收到解析的 PHP 输出。因此,如果文件中充满了未输出的变量或常量,则它不是不安全的。但是,正如您所说,您希望将此文件保留在 DocumentRoot 之下。没有什么能阻止您将它包含到您的 AJAX php 脚本中。

标签: php ajax session sessionid error-log


【解决方案1】:

不确定这是否能解决您的问题,但您应该在 Ajax 中调用的 php 脚本的顶部添加以下内容:

header('Cache-control: no-cache, must-revalidate');
header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');

它解决了我在使用会话和 Ajax 时遇到的一些问题。

【讨论】:

  • 必须在 session_start() 之后添加
  • 你得到了什么 var_dump($_SESSION) ?估计是空的自上次运行以来,您一定修改了一些代码。
  • 无论如何,我宁愿用你的 dbase 连接创建一个单独的文件,或者更好的是你可以调用的 Dbase 类,而不是将数据库连接信息存储在 Session 变量中,这在所有...
  • 感谢您的信息,我现在正在使用这种方法,因为我认为它比我之前传递连接信息的方式更好。所以我想这不像你说的那样很安全。我将研究创建这个类。有什么建议从哪里开始学习?
  • 我会在另一个答案中给你一个例子
【解决方案2】:

这是您可以使用的类。它是单例的,以确保您只实例化一次。实例化它

$db = Db::getInstance();

然后

$db->connect();

这是使用 Dbase 连接的一种更安全的方式(注意我使用了 PDO,但如果您确实需要继续使用 mysql_ 函数,您仍然可以修改它)。

class Db {

    private static $instance = null;
    private $db = null;
    private $host = '';
    private $name = '';
    private $username = '';
    private $password = '';

    private function __construct() {
        $this->host = 'yourHost';
        $this->name = 'yourDbName';
        $this->username = 'yourUserName';
        $this->password = 'youPassword';
    }

    public static function getInstance() {
        if(is_null(self::$instance)) {
            self::$instance = new Db();
        }
        return self::$instance;
     }

     public function connect() {
        try {
            $this->db = new PDO('mysql:host=' . $this->host . ';dbname=' . $this->name, $this->username, $this->password);
        } catch(Exception $e) {
            throw new Exception('Connection error: either the database is unavailable or connection infos are not valid. Please contact the webmaster.');
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多