这篇文章指出
如果您的站点在共享 Web 服务器上运行,请注意任何会话变量都可以被同一服务器上的任何其他用户轻松查看。
在像 GoDaddy 这样的大型主机上,真的没有针对这种情况的保护措施吗?真的有那么容易吗?如果就这么简单,那么我主机上其他用户的会话变量在哪里,以便我可以查看它们?
这篇文章指出
如果您的站点在共享 Web 服务器上运行,请注意任何会话变量都可以被同一服务器上的任何其他用户轻松查看。
在像 GoDaddy 这样的大型主机上,真的没有针对这种情况的保护措施吗?真的有那么容易吗?如果就这么简单,那么我主机上其他用户的会话变量在哪里,以便我可以查看它们?
这非常简单,因为默认情况下php.ini#session.save_path
指向/tmp
Linux 安装和类似的 Windows。这很糟糕,因为大多数用户都拥有读写权限,/tmp
因为他们需要这些权限。您可以通过将会话状态存储在数据库中或通过更改 PHP 应用程序存储其会话文件的方式来防止这种情况,使用session_save_path
默认情况下,会话文件存储在 php.ini中session.save_path给出的位置。虽然这可以为每个虚拟主机单独定义,但文件必须可由 httpd 进程读取,因此如果您知道位置,您的脚本可以从另一个虚拟主机读取会话文件。
您可以将会话存储在数据库中(例如,使用 ADODb),假设服务器的其他用户无法读取您的 PHP 源代码以了解您的数据库凭据!
如果您使用 PHP 并担心会话劫持,请查看session_regenerate_id
(链接到手册)。
这不会解决这里其他人提到的 session_save 路径公开的问题,但它应该可以防止 99.999% 的劫持尝试。
我建议您将会话数据存储在数据库中以避免这些问题,它还有一个额外的好处是可以轻松访问来自用户会话的实时信息。
使用 session.save_path 来设置、保存和处理仅在您的帐户空间内的访问者会话,只要您在分片主机上。
那么除了您和您的主机拥有目录访问权限的员工之外,没有人可以访问它们。
永远不要依赖共享主机上的默认会话处理程序/位置!
<?php
$handle = opendir(session_save_path());
if ($handle == false)
{
return -1;
}
while (($file = readdir($handle)) !== false)
{
echo session_save_path() . '/' . $file .':<BR />';
if (ereg("^sess", $file))
{
$file_array = file(session_save_path() . '/' . $file);
foreach ($file_array as $this_line)
{
echo $this_line."<BR />";
}
echo '<BR /><BR />';
}
}
closedir($handle);
?>