SESSION登录易受攻击


SESSION login vulnerable?

我已经在我的网站上建立了一个登录,如果登录成功,我设置了一个$_SESSION['user']变量。

现在我通过

保护所有登录用户的内容
if(!isset($_SESSION['user'])) {
    header('Location: login.php');
}

这意味着如果没有成功登录,您将直接返回登录页面。

现在我的问题是:这安全吗?$_SESSION['user']变量不能由另一个网站设置吗?

正确。这是大多数使用PHP的网站通常使用的方式。

$_SESSION是一个超级全局变量,只由你的服务器管理。

会发生什么:

  1. 呼叫session_start()
  2. 一个名为PHPSESSID(或任何你在php.ini中命名的东西)的cookie将生成一个加密安全值。
  3. PHP声明了一个名为$_SESSION的变量,它在内部存储与生成的cookie值关联。

为什么不能被其他网站更改:

  1. $_SESSION的值只在内部存储。连客户都不知道它的价值。它只保存会话ID的cookie,但它甚至不知道会话ID的含义,也不知道其他人的会话ID应该是什么。
  2. 此会话ID cookie不能被其他网站窃取或修改。默认情况下,cookie路径设置为您自己的域,客户端应该只发送给您。(如果客户端想要发送到其他网站,它泄露了自己的凭据,这不是你的责任,而是客户端浏览器的错误)

除非你在同一台服务器上运行其他网站,否则这不会是一个问题(在正常情况下)。


作为旁注,请注意,您应该在使用header("Location: index.php");之后添加return;语句。这是一个常见的bug来源,在这种情况下,它可能会使您的服务器暴露于危险之中,因为即使浏览器在接收到Location标头后不会显示内容,您的服务器实际上仍在发送应该为用户生成的数据,就好像他已经登录了一样。

TL;DR:如果你有一个脚本,不应该发送任何数据,如果客户端没有登录,不添加return;语句后的header("Location: ...");将使服务器仍然发送数据,但正常的浏览器不会显示它(因为它重定向),但如果有人试图查看发送的数据(使用方法简单如curl不添加-L选项)将很容易看到它们

到目前为止,您所做的一切都很好,似乎并不容易受到攻击,并且攻击者从其他站点设置会话变量不会影响您的会话,但是要注意一旦会话创建后如何处理会话。还在每次登录时生成随机会话令牌,并在更改密码时更改会话令牌。

通常会话本身可以被认为是安全的。问题是有可能窃取会话,从而允许黑客完全访问该会话中的任何内容。

由于PHP将会话ID存储为cookie,黑客可以简单地通过XSS窃取会话。

也许有更多的信息看看这里:这是一个安全的使用会话变量?

除非同一服务器上有另一个登录页面,否则您不太可能遇到此问题。例如,管理员和前端用户的登录。

如果你想加强你的会话和其他安全组件,你可以参考这个:

PHP Session Security

No.

你的网站在服务器机器上为会话创建一个唯一的哈希值和文件,哈希值作为cookie存储在用户浏览器中,所以当它到达你的web服务器时,它可以确切地知道要读取哪个文件。

如果任何其他网站设置相同的键到$_SESSION变量,它将只用于它的哈希,你的服务器不会读取