我在我的网站上建立了一个登录,如果登录成功,我会设置一个$_SESSION['user']
变量。
现在我通过
保护登录用户的所有内容if(!isset($_SESSION['user'])) {
header('Location: login.php');
}
这意味着如果没有成功登录,您将直接返回登录页面。
现在我的问题:这是安全的吗?其他网站无法设置$_SESSION['user']
变量吗?
答案 0 :(得分:3)
这是对的。这是大多数使用PHP的网站通常使用的方式。
$_SESSION
是一个超级全局变量,仅由您的服务器管理。
会发生什么:
session_start()
PHPSESSID
的Cookie(或您在php.ini
中为其命名的任何内容)并具有加密安全值的Cookie。$_SESSION
的变量,该变量在内部存储,并与生成的cookie值相关联。为什么其他网站无法更改:
$_SESSION
的值仅存储在内部。甚至客户都不知道它的价值。它只保存会话ID的cookie,但它甚至不知道会话ID的含义,也不知道其他人的会话ID应该是什么。除非您在同一台服务器上运行其他网站,否则这不会成为问题(在正常情况下)。
作为旁注,请注意您在使用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)
答案 4 :(得分:0)
没有
您的网站在服务器计算机上为会话创建了一个唯一的哈希和文件,并且哈希值作为cookie存储在用户浏览器中,因此当它到达您的网络服务器时,它可以知道要读取哪个文件。
如果任何其他网站为$_SESSION
变量设置了相同的密钥,那么它将仅用于其服务器不会读取的哈希值。