用户首次访问我的网站时,会创建一个会话,用于存储其IP地址及其用户代理。 如果我的数据库中存在这些,我使用他们的id,否则我插入它们并使用 PDO-> lastInsertId
问题 - 我是否可以相信php会话仅由一个IP地址和一个用户代理使用?
这就是$_SESSION['ip']
的样子:
array(2) {
["id"]=>
string(1) "1" /* row id in the table */
["full"]=>
string(99) "Mozilla/5.0 bla-bla"
}
基本上这就是我正在做的事情:
if(isset($_SESSION['ip'])) {
if($_SESSION['ip']['full'] === $ip)
return $_SESSION['ip']['id'];
session_destroy();
session_start();
}
$ipId = query('SELECT id FROM ip_addresses WHERE ip=$ip');
// yes, prepared statements are used
if(!$ipId) {
query('INSERT INTO ip_addresses (ip) VALUES ($ip)');
$ipId = lastInsertId();
}
$_SESSION['ip'] = ['id' => $ipId,
'full' => $ip ];
我的想法是防止多个用户使用一个会话 这段代码是OK还是我可以删除此检查?
您可以在此处找到完整的代码 - http://pastebin.com/VFVJxTW5
答案 0 :(得分:2)
你的PHP会话和你的IP地址几乎没有关系。很少有例子可以说清楚。您可以在同一台PC上使用多个浏览器,每个浏览器都有自己的(不同的)会话。例如,当您从通过路由器连接到互联网的家庭网络访问您的网站时,它们通常共享相同的(出站)IP地址 - 通过您的ISP连接到互联网的路由器的IP地址。这意味着即使是不同设备上的多个用户也可以在您的网站上拥有不同的会话。
在所有这些场景中,PHP将根据请求是否已包含会话ID生成新的session_id或使用现有的session_id。对于较旧的PHP版本,将会话ID添加到url作为参数有时很常见,因此很容易将其视为URL的一部分。这显然是一个坏主意,因为每个知道URL的人都可以劫持会话。但是你可以很容易地看到,在URL中使用了哪个会话(这也是导致它变坏的原因)。
那么如何确保只使用一个会话?有多种方式。我能想到的最简单的一种方法是使用database session handler来存储会话,当用户登录时,通过查询表来检查该用户是否存在现有的活动会话。大多数框架(如Zend Framework或Symfony)都提供了一个数据库会话处理程序,您可以将其用作示例。
答案 1 :(得分:0)
认为会话对域和机器有效,那么每个会话就有一个唯一的用户。