重要的是要认识到,session.cookie_lifetime=0 会在浏览器关闭时删除 cookie,但如今浏览器往往不会在最后一个窗口或标签页关闭后立即关闭。
为了启动速度和检索推送流量,浏览器会降至后台,因此 cookie 会保留下来。
通过保护与会话相关的 INI 设置,开发人员可以提高会话安全。一些重要的 INI 设置没有推荐设置。开发人员负责强化会话设置。
0
具有特殊的含义。它通知浏览器不要将 Cookie 存储到永久存储中。因此,当浏览器终止时,会话 ID Cookie 会立即被删除。如果开发人员将其设置为非 0,则可能会允许其他用户使用会话 ID。大多数应用程序应该为此使用 "0
"。
如果需要自动登录功能,开发人员必须实现自己的安全自动登录功能。不要为此使用长期有效的会话 ID。更多信息可以在上面相关部分找到。
虽然 HTTP Cookie 存在一些问题,但 Cookie 仍然是管理会话 ID 的首选方式。只有在可能的情况下才使用 Cookie 来管理会话 ID。大多数应用程序应该使用 Cookie 来保存会话 ID。
如果 session.use_only_cookies=Off,则会话模块将在会话 ID Cookie 未初始化的情况下使用 GET 或 POST 设置的会话 ID 值。
虽然启用 session.use_strict_mode 对安全会话来说是必须的。但默认情况下它被禁用。
这可以防止会话模块使用未初始化的会话 ID。换句话说,会话模块只接受由会话模块生成的有效会话 ID。它拒绝用户提供的任何会话 ID。
由于 Cookie 规范,攻击者可以通过在本地设置 Cookie 数据库或 JavaScript 注入来放置不可删除的会话 ID Cookie。 session.use_strict_mode 可以防止使用攻击者初始化的会话 ID。
注意:
攻击者可能会用自己的设备初始化一个会话 ID,并可能设置受害者的会话 ID。他们必须保持会话 ID 的活动状态才能进行滥用。攻击者需要额外的步骤才能在这种情况下执行攻击。因此, session.use_strict_mode 是一种缓解措施。
拒绝 JavaScript 访问会话 Cookie。此设置可以防止通过 JavaScript 注入窃取 Cookie。
可以将会话 ID 用作 CSRF 令牌,但不推荐这样做。例如,HTML 源代码可能被保存并发送给其他用户。为了更好的安全,开发人员不应该在网页中写入会话 ID。几乎所有应用程序都必须为会话 ID Cookie 使用 httponly 属性。
注意:
CSRF 令牌应该像会话 ID 一样定期更新。
只有在协议为 HTTPS 时才允许访问会话 ID Cookie。如果网站只能通过 HTTPS 访问,则应该启用此设置。
对于只能通过 HTTPS 访问的网站,应该考虑 HSTS。
session.cookie_samesite="Lax" 或 session.cookie_samesite="Strict"
从 PHP 7.3 开始,可以为会话 ID Cookie 设置 "SameSite"
属性。此属性是一种缓解 CSRF(跨站点请求伪造)攻击的方法。
Lax 和 Strict 之间的区别在于 Cookie 在来自另一个可注册域并使用 HTTP GET 方法的请求中是否可访问。使用 Lax 的 Cookie 在来自另一个可注册域的 GET 请求中是可访问的,而使用 Strict 的 Cookie 则不可访问。
session.gc_maxlifetime=[选择尽可能小的值]
session.gc_maxlifetime 是一个用于删除过时会话 ID 的设置。不推荐依赖此设置。开发人员应该自己用时间戳来管理会话的生存期。
会话 GC(垃圾回收)最好通过使用 session_gc() 来执行。 session_gc() 函数应该由任务管理器执行。例如,在类 Unix 系统上使用 cron。
默认情况下,GC 是通过概率执行的。此设置不保证删除过时的会话。尽管开发人员不能依赖此设置,但建议将其指定为尽可能小的值。调整 session.gc_probability 和 session.gc_divisor 以使过时的会话以适当的频率被删除。如果需要自动登录功能,开发人员必须实现自己的安全自动登录功能,有关更多信息,请参见上面。切勿为此功能使用长期有效的会话 ID。
注意:
一些会话保存处理程序模块不使用此设置来进行基于概率的过期。例如,memcached、memcache。有关详细信息,请参阅会话保存处理程序文档。
不禁止使用透明会话 ID 管理。开发人员可以在需要时使用它。但是,禁用透明会话 ID 管理可以通过消除会话 ID 注入和/或泄漏的可能性来提高总体会话 ID 安全性。
注意:
会话 ID 可能会从书签 URL、电子邮件 URL、保存的 HTML 源代码等中泄漏。
session.trans_sid_tags=[有限的标签]
(PHP 7.1.0 >=) 开发人员不应该重写不必要的 HTML 标签。默认值应该足以满足大多数用法。较旧的 PHP 版本使用 url_rewriter.tags 而不是它。
session.trans_sid_hosts=[有限的主机]
(PHP 7.1.0 >=) 此 INI 定义允许 trans sid 重写的白名单主机。切勿添加不受信任的主机。当此设置为空时,会话模块只允许 $_SERVER['HTTP_HOST']
。
session.referer_check=[源 URL]
当 session.use_trans_sid 启用时。它可以降低会话 ID 注入的风险。如果网站是 http://example.com/
,则将其设置为 http://example.com/
。请注意,在 HTTPS 中,浏览器不会发送 referrer 标头。浏览器可能通过配置不发送 referrer 标头。因此,此设置不是可靠的安全措施。建议使用此设置。
session.cache_limiter=nocache
确保 HTTP 内容对于已验证的会话是不可缓存的。只有当内容不是私密时才允许缓存。否则,内容可能会被泄露。如果 HTTP 内容不包含安全敏感数据,则可以使用 "private"
。请注意,"private"
可能会传输被共享客户端缓存的私密数据。 "public"
只能在 HTTP 内容根本不包含任何私密数据时使用。
session.sid_length="48"
(PHP 7.1.0 >=) 更长的会话 ID 会导致更强的会话 ID。开发人员应该考虑将会话 ID 长度设置为 32 个字符或更多。当 session.sid_bits_per_character="5" 时,至少需要 26 个字符。
session.sid_bits_per_character="6"
(PHP 7.1.0 >=) 会话 ID 字符中的位数越多,会话模块为相同会话 ID 长度生成的会话 ID 就越强。
session.hash_function="sha256"
(PHP 7.1.0 <) 更强的哈希函数会生成更强的会话 ID。尽管即使使用 MD5 哈希算法,哈希冲突也很不可能,但开发人员应该使用 SHA-2 或更强的哈希算法,如 sha384 和 sha512。开发人员必须确保他们为使用的哈希函数提供足够长的 熵。
session.save_path=[非世界可读目录]
如果将其设置为一个世界可读目录,例如 /tmp(默认值),则服务器上的其他用户可以通过获取该目录中文件的列表来劫持会话。
重要的是要认识到,session.cookie_lifetime=0 会在浏览器关闭时删除 cookie,但如今浏览器往往不会在最后一个窗口或标签页关闭后立即关闭。
为了启动速度和检索推送流量,浏览器会降至后台,因此 cookie 会保留下来。
警告:如果 `session_start()` 已经调用,则调用 `ini_set('session.use_only_cookies', 1)` 会返回 FALSE。