【发布时间】: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: username 和Undefined 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