SESSION登录易受攻击?

时间:2016-08-11 07:17:27

标签: php session login

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

现在我通过

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

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

现在我的问题:这是安全的吗?其他网站无法设置$_SESSION['user']变量吗?

5 个答案:

答案 0 :(得分:3)

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

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

会发生什么:

  1. 您致电session_start()
  2. 将生成一个名为PHPSESSID的Cookie(或您在php.ini中为其命名的任何内容)并具有加密安全值的Cookie。
  3. PHP声明一个名为$_SESSION的变量,该变量在内部存储,并与生成的cookie值相关联。
  4. 为什么其他网站无法更改:

    1. $_SESSION的值仅存储在内部。甚至客户都不知道它的价值。它只保存会话ID的cookie,但它甚至不知道会话ID的含义,也不知道其他人的会话ID应该是什么。
    2. 此会话ID Cookie不能被其他网站窃取或修改。默认情况下,cookie路径设置为您自己的域,客户端只应将其发送给您。 (如果客户想要发送到其他网站,它会泄露自己的凭据,这不是你的责任,而是客户浏览器的错误)
    3. 除非您在同一台服务器上运行其他网站,否则这不会成为问题(在正常情况下)。

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

      TL; DR:如果您的脚本在客户端未登录时不应发送任何数据,则在return;之后不添加header("Location: ...");语句会使服务器仍然发送数据,但是普通浏览器不会显示它(因为它重定向),但是如果有人试图查看发送的数据(使用像curl这样简单的方法而不添加-L选项)将很容易看到它们。

答案 1 :(得分:2)

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

答案 2 :(得分:2)

一般来说,会话​​本身可以被认为是安全的。问题是可以窃取一个会话,允许黑客完全访问该会话中的任何内容。

由于PHP将会话ID存储为cookie,黑客只需使用XSS就可以窃取会话。

或许可以在这里查看更多信息:Is this a safe use of Session Variables?

答案 3 :(得分:1)

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

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

PHP Session Security

答案 4 :(得分:0)

没有

您的网站在服务器计算机上为会话创建了一个唯一的哈希和文件,并且哈希值作为cookie存储在用户浏览器中,因此当它到达您的网络服务器时,它可以知道要读取哪个文件。

如果任何其他网站为$_SESSION变量设置了相同的密钥,那么它将仅用于其服务器不会读取的哈希值。