如何有效地处理PHP会话?

时间:2017-04-05 08:31:29

标签: php session web-crawler google-crawlers

这就是我在整个网站上加载的$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']。我抬起头来发现了这个:

enter image description here

所以这是谷歌抓取机器人。由于有更多的搜索引擎和机器人,我不想将这些抓取保存在我的会话文件中,并用它填满我的网站空间。

所以我的问题是:

1)即使测试生命周期值(60秒)结束,会话文件仍保留在自定义目录中。我读这是因为我设置了一个自定义目录。这是真的吗?

2)删除所有未使用/过期的会话文件的有效方法是什么?我应该添加带有时间戳的$_SERVER['HTTP_HOST']并让cronjob查看我的自定义目录,获取会话文件数据并计算过期会话以将其删除吗?

3)我应该避免那些机器人抓取工具只是在Internal Server Error内寻找字符串“bot”来保存那些不需要的会话,还是有更好的方法来识别“非人类访问者”/抓取工具?

我也很欣赏顶部代码的任何改进/建议。我之前刚刚引发了一些session_start(),因为php-fpm-slow已被调用到我可以从{{1}} - 日志中查询。

2 个答案:

答案 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脚本进行清理定期 - 在这种情况下你会遇到自定义目录的问题,并且有几个选项:

  • 手动重新启用 session.gc_probability
  • 直接在php.ini中配置 session.save_path ,因此默认的cron脚本可以选择它。
  • 请勿使用自定义目录。鉴于你目前有getcwd().'/a/',我会说Debian上的默认会话dir几乎肯定是一个更安全的位置,所以它客观上会更好。
  • 写你自己的cronjob来做到这一点,但你必须真正知道你在做什么。 $_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)

  1. cleanup php session files

  2. 这个cronjob已经存在(参见1.) - 由于内存使用和TTL,最有效的方法是将会话数据存储在memcached而不是普通文件中。

  3. 您应避免将字符串与用户代理或主机进行比较,因为它不可靠,HTTP_HOST是您的本地主机名,而不是远程主机名,也是您不应该制作的最重要原因谷歌机器人的任何不同之处:你伪造网站的行为,这对你的谷歌排名非常不利。欢迎谷歌像任何其他网站访问者。