[英]secure sessions/cookies in php
我对会话有疑问。 你如何建立一个安全的登录会话/ cookie。 我在看这个例子,他们将这个数组添加到会话中:
$data = array{
username = $_POST['username'];
is_logged = true;
}
我想知道这是否足够? 是不是可以将cookie中的用户名更改为任何内容或任何人? 有什么好办法可以解决这个问题?
或者这是完全安全的,我错过了什么?
另外,你们怎么看待在数据库中存储会话? 我知道CI有一个内置功能来做到这一点。 这会导致任何性能方面的问题,还是值得鼓励?
我相信你误解了PHP会话应该如何工作。 您可以安全地将用户名,登录状态和其他内容存储到$_SESSION
数组中,因为它存储在服务器端。 发送到浏览器的唯一事情是一个cookie(名为PHPSESSID,除非你在php.ini
更改了它)包含会话ID - 这是一个唯一的随机数。
一旦访问者在每次请求顶部都有session_start()
的页面时都有活动会话, session_start()
将查看名为PHPSESSID的cookie的请求,读取服务器端会话文件(如果会话存在且有效)并恢复提交的$_SESSION
数组。 这个数组永远不需要离开服务器。
会话cookie的设置没有到期日期(除非你弄乱了php.ini中的session.cookie_lifetime
选项),因此浏览器会在关机时删除它。 服务器上的会话文件本身有一个到期时间,由session.gc_maxlifetime
(以秒为单位)管理。
更安全会话的途径:
session.use_cookies=1
, session.use_only_cookies = 1
, session.use_trans_id = 0
(我将为您提供备用语法的详细信息) md5()
,Accept标头,远程IP地址或这些组合; 检查每个具有现有会话ID的新请求是否匹配 session.save_path
设置为只有你和PHP有权访问的文件夹。 最后,您应该创建一个脚本来将用户注销会话(并鼓励他们使用它而不是简单地导航)。 这是一个示例脚本:
<?php
session_start();
$params = session_get_cookie_params();
setcookie(session_name(), '', 1, $params['path'], $params['domain'], $params['secure'], isset($params['httponly']));
session_regenerate_id(true);
session_destroy();
session_write_close();
header('Location: your_login_page.php');
exit;
是的,这是一种非常不安全的方法,如果你想阻止会话劫持,不应该在任何地方使用它。
更鲁棒的方法是在用户登录时为用户生成唯一的会话ID(例如,散列),并将会话与该ID服务器端相关联。 然后仅将cookie中的此会话ID发送回客户端。 当客户端使用cookie发送请求时,您将获取会话ID并恢复用户名以及与其相关的任何其他信息以进行请求处理。
客户端可以访问cookie中的会话ID,但是这个值对他来说没有意义,因为他无法从中推断出任何信息,并且发送随机会话ID几乎没有成功的机会。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.