这就是我在整个网站上加载的$suid = 0;
session_set_cookie_params(60, '/', '.' . $_SERVER['HTTP_HOST'], true);
session_save_path(getcwd() . '/a/');
if (!isset($_SESSION['id'])) {
session_start(['cookie_lifetime' => 60]);
$_SESSION['id'] = session_id();
$_SESSION['start'] = date('d_m_Y_H_i');
$_SESSION['ip'] = $_SERVER['REMOTE_ADDR'];
} elseif (isset($_SESSION['uid'])) {
$suid = $_SESSION['uid'];
}
的样子:
ip
我目前正在测试PHP会话,所以我只把60秒作为生命周期。
我想知道为什么会话创建,因为还没有人知道域名,所以我添加了$_SESSION['last_activity']
。我抬起头来发现了这个:
所以这是谷歌抓取机器人。由于有更多的搜索引擎和机器人,我不想将这些抓取保存在我的会话文件中,并用它填满我的网站空间。
所以我的问题是:
1)即使测试生命周期值(60秒)结束,会话文件仍保留在自定义目录中。我读这是因为我设置了一个自定义目录。这是真的吗?
2)删除所有未使用/过期的会话文件的有效方法是什么?我应该添加带有时间戳的$_SERVER['HTTP_HOST']
并让cronjob查看我的自定义目录,获取会话文件数据并计算过期会话以将其删除吗?
3)我应该避免那些机器人抓取工具只是在Internal Server Error
内寻找字符串“bot”来保存那些不需要的会话,还是有更好的方法来识别“非人类访问者”/抓取工具?
我也很欣赏顶部代码的任何改进/建议。我之前刚刚引发了一些session_start()
,因为php-fpm-slow
已被调用到我可以从{{1}} - 日志中查询。
答案 0 :(得分:2)
1)即使测试生命周期值(60秒)结束,会话文件仍保留在自定义目录中。我读这是因为我设置了一个自定义目录。这是真的吗?
不,会话GC会选择自定义目录,并清除文件。它不会立即发生。
2)删除所有未使用/过期的会话文件的有效方法是什么?我应该添加带有时间戳的
$_SESSION['last_activity']
并让cronjob查看我的自定义目录,获取会话文件数据并计算过期会话以将其删除吗?
PHP 7.1有session_gc(),您可以从cronjob调用它,它将执行所有必要的操作。
在较旧的PHP版本中,您默认依赖probability-based GC,其中清理是随机执行的。
这可能不是特别有效,但它是十多年来唯一的通用解决方案,所以......
然而,如果您的服务器运行Debian,它可能将 session.gc_probability 设置为0
并使用特定于Debian的crontab脚本进行清理定期 - 在这种情况下你会遇到自定义目录的问题,并且有几个选项:
getcwd().'/a/'
,我会说Debian上的默认会话dir几乎肯定是一个更安全的位置,所以它客观上会更好。$_SESSION['last_activity']
甚至不适用于此;文件系统本身提供的文件访问/修改时间是。3)我应该避免那些机器人抓取工具只是在
$_SERVER['HTTP_HOST']
内寻找字符串“bot”来保存那些不需要的会话,还是有更好的方法来识别“非人类访问者”/抓取工具?
您正在考虑$_SERVER['HTTP_USER_AGENT']
,但不是 - 这不是解决方案。
鲜为人知(或在很大程度上被忽略,为方便起见),但正确执行此操作的唯一方法是永远不要在登录之前启动会话 。
抓取无用会话文件的抓取工具的烦恼是一个可以忽略的问题;真正关心的是确定的攻击者填充会话存储的能力,使用所有可能的会话ID,避免session.use_strict_mode
- 这些攻击都不容易实现,但可能会导致DoS或会话固定,所以他们也不应轻易被视为可能性。
P.S。额外提示:不要使用$_SERVER['HTTP_HOST']
- 来自HTTP Host
标头的用户输入;在这种情况下,由于cookie的工作方式可能是安全的,但一般情况下应该避免使用。
答案 1 :(得分:1)
这个cronjob已经存在(参见1.) - 由于内存使用和TTL,最有效的方法是将会话数据存储在memcached而不是普通文件中。
您应避免将字符串与用户代理或主机进行比较,因为它不可靠,HTTP_HOST
是您的本地主机名,而不是远程主机名,也是您不应该制作的最重要原因谷歌机器人的任何不同之处:你伪造网站的行为,这对你的谷歌排名非常不利。欢迎谷歌像任何其他网站访问者。