我有几个关于PHP会话的问题:
我期待我的Apache服务器在会话到期时自动从服务器中删除旧的php会话数据。这是PHP中的某个位置还是服务器中的其他位置?例如,我已将expiretime设置为15分钟,并且在会话到期后,我希望将其从服务器中删除,以防止累积10万个会话文件:
$expireTime = 60 * 60 * .25; // 15 minute expire time
session_set_cookie_params($expireTime,"/");
为防止固定,我在WebApplication的每个页面加载中执行以下操作:
session_start();
session_regenerate_id(); // Prevent Fixation: Regen session ID every page load.
这引出了另一个问题 - 如果我每次都重新生成会话ID(因为我这样做,我在服务器上创建了一个新的会话文件) - 我可以以某种方式立即安全地删除以前的会话文件吗?或者这是不好的做法?
我计划在会话中存储大量基本用户信息 - 这是一种不好的做法吗?信息包括:
我计划实施IP检查,以便在上述代码之前,服务器检查当前的IP($ _SERVER ['REMOTE_ADDR'])并验证它是否与之前的IP匹配。如果没有,我会重定向到登录页面。如果是,那么我们可以继续并重新生成上面列出的新会话ID ...对此有何想法?
是否有任何我缺少接受会话安全解决方案的内容?
答案 0 :(得分:1)
1。 在处理旧的会话数据时,PHP有点令人困惑。
以下php.ini指令在确定要删除的会话数据时起作用:
session.gc_probability
session.gc_divisor
session.gc_maxlifetime
这三个指令控制概率,即在发出session_start()时,PHP会查找并清理旧会话。
您可以在此处查看这些指令的确切含义:http://www.php.net/manual/en/session.configuration.php
此外,大多数发行版中的PHP包都注册了一个cronjob,它清理会话目录,例如在我的ubuntu框中,作业每30分钟运行一次,并查找较旧的文件,这些文件在/ usr中指定的秒数/ LIB / PHP5 / maxlifetime。
简短:你真的不必担心这个。
2。 您不必在每次加载页面时重新生成会话ID,只需在登录时重新生成它即可。 (或者当与会话ID相关联的权限发生变化时)。
在会话中存储用户信息并非坏习惯。但是,在这种情况下,我只会存储userid,并在页面加载时根据它拉出用户信息。
想象一下以下场景:
User A logs in.
User B logs in.
User B deletes User A from the system.
User A is still logged in, because has the (now deleted) user data in his session.
将IP与之前请求的IP进行比较是可以的,请记住,IP可以有正当理由进行更改,例如,如果有人正在使用TOR浏览网站,那么请选择用户跳过此检查。 (您也可以查看浏览器的user_agent)
答案 1 :(得分:1)
我期待我的Apache服务器在会话到期时自动从服务器中删除旧的php会话数据。这是PHP中的某个位置还是服务器中的其他位置?
PHP默认会话处理程序的会话到期方案非常复杂,而且相当懒惰。虽然会话在理论上已过期,但不会立即销毁。 PHP使用垃圾收集器来删除过期的会话数据。
但cookie生命周期(即session.cookie_lifetime)与会话到期无关。它只是控制cookie的生命周期,即使cookie过期,会话仍然有效,反之亦然。
有关详细信息,另请参阅my answer to How do I expire a PHP session after 30 minutes?。
[...]如果我重新生成会话ID [...]我可以以某种方式安全地立即删除以前的会话文件吗?或者这是不好的做法?
不,更改会话状态更改的会话ID非常重要。要销毁仍与旧会话ID关联的会话数据,您只需将 delete_old_session 参数设置为true,即:
session_regenerate_id(true);
但我不会在每个请求上更改会话ID,而只会在成功进行身份验证后更改会话状态,更改权限级别等后更改会话ID。此外,在一定时间后定期更改会话ID (例如五分钟)。
我计划实施IP检查[...]并验证它是否与之前的IP匹配。 [...]对此的想法?
我不认为这是个好主意。因为在整个会话期间客户端可能没有相同的IP地址。可能IP地址甚至随着每个请求而变化。更好地使用客户提供的不太可能更改多个请求的其他信息。
答案 2 :(得分:0)
您可以编写自己的会话处理程序来自行决定保存会话数据的方式和位置。
http://php.net/manual/en/function.session-set-save-handler.php
然后您可以完全控制,并且可以以数据库或加密形式保存数据。