php session 锁机制和基本安全设置

session锁

为了处理同一用户并发请求带来的问题,php的session是有锁的,并发操作时采用串行方式。

session_start()之后就一直独占该sessionId文件的锁,在session_write_close()之后才会释放。

所以不再使用session之后最好使用session_write_close()。

同一个脚本是允许多次session_start()和session_write_close()的。

session_start()之后session变量便压入内存,因此也是可以访问压入的session,只是不能再写

相关安全设置

php 手册 session安全

session.cookie_lifetime=0

0 表示特殊含义,关闭浏览器的时候,会话 ID cookie 会被立即删除。 如果将此项设置为非 0 的值,可能会导致会话 ID 被其他用户使用。 大部分应用应该把此项设置为“0”

session.use_cookies=On 并且 session.use_only_cookies=On

虽然 HTTP cookie 存在一些问题, 但是它确实是实现会话 ID 管理的优选方案。 尽可能的仅使用 cookie 来进行会话 ID 管理, 而且大部分应用也确实是只使用 cookie 来记录会话 ID 的。

session.use_strict_mode=On

此设置防止会话模块使用未初始化的会话 ID。 也就是说, 会话模块仅接受由它自己创建的有效的会话 ID, 而拒绝由用户自己提供的会话 ID。 使用 JavaScript 对 cookie 进行注入 就可以实现对会话 ID 的注入, 甚至可以在 URL 的查询字符串中或者表单参数中实现会话 ID 的注入。 大部分应用没理由也不应该接受由用户提供的未经初始化的会话 ID。

session.cookie_httponly=On

禁止 JavaScript 访问会话 cookie。 此设置项可以保护 cookie 不被 JavaScript 窃取。 虽然可以使用会话 ID 来作为防范跨站请求伪造(CSRF)的关键数据, 但是不建议你这么做。 例如,攻击者可以把 HTML 源代码保存下来并且发送给其他用户。 为了安全起见, 开发者不应该在 web 页面中显示会话 ID。 几乎所有的应用都应该对会话 ID cookie 设置 httponly 为 On。

session.cookie_secure=On

仅允许在 HTTPS 协议下访问会话 ID cookie。 如果你的 web 站点仅支持 HTTPS,那么必须将此选项设置为 On。 对于仅支持 HTTPS 的 web 站点建议考虑使用强制安全传输技术(HSTS)。

session.gc_maxlifetime=[尽可能的小]

GC 的运行时机并不是精准的,带有一定的或然性,所以这个设置项并不能确保 旧的会话数据被删除。某些会话存储处理模块不使用此设置项。 更多的信息请参考会话存储模块的完整文档。 虽然开发人员不能完全依赖这个设置,但是还是建议将其设置的尽可能的小。 调整 session.gc_probability 和 session.gc_divisor 设置项 可以使得过期的会话数据在适当的周期内被删除。 如果需要使用自动登录的功能,请使用其他更加安全的方式自行实现, 而不要通过使用长生命周期的会话 ID 来实现。

session.use_trans_sid=Off

如果确实需要, 你也可以使用透明的会话 ID 管理。 禁用透明会话 ID 管理可以提高安全性, 规避会话 ID 注入和泄露的风险。

session.referer_check=[你的源 URL]

当启用 session.use_trans_sid 设置项时, 建议尽可能的联合使用此设置项来降低会话 ID 注入的风险。 假设你的站点是 http://example.com/, 请将此设置项置为 http://example.com/。 需要注意的,如果使用 HTTPS , 浏览器将不会发送 referrer 请求头, 因此,从安全角度考虑,此设置项并不总是可信赖的。

session.cache_limiter=nocache

确保对于已经认证的会话, 其 HTTP 内容不被缓存。 你应仅允许缓存公开的内容, 否则将面临内容暴露的风险。 如果 HTTP 内容中不包含安全信息或敏感数据,可以使用“private”。 注意,“private”可能会导致客户端缓存私有数据。 仅在 HTTP 内容中不包含任何私有数据的时候,可以使用“public”。