# 和会话安全相关的配置项

* [session.cookie_lifetime](#sessioncookielifetime)
* [session.use_only_cookies](#sessionuseonlycookies)
* [session.use_strict_mode](#sessionusestrictmode)
* [session.cookie_httponly](#sessioncookiehttponly)
* [session.cookie_secure](#sessioncookiesecure)
* [session.gc_maxlifetime](#sessiongcmaxlifetime)
* [session.use_trans_sid](#sessionusetranssid)
* [session.trans_sid_tags](#sessiontranssidtags)
* [session.trans_sid_hosts](#sessiontranssidhosts)
* [session.referer_check](#sessionreferercheck)
* [session.cache_limiter](#sessioncachelimiter)
* [session.sid_length](#sessionsidlength)
* [session.sid_bits_per_character](#sessionsidbitspercharacter)
* [session.hash_function](#sessionhashfunction)

## session.cookie_lifetime

`session.cookie_lifetime = 0` ，它告知浏览器不要持久化存储 Cookie 数据。也就是说，关闭浏览器的时候，会话 ID Cookie 会被立即删除。如果将此项设置为非 0 的值，可能会导致会话 ID 被其他用户使用。大部分应用应该把此项设置为 0 。如果应用中有自动登录的功能，请自行实现一种更加安全的方式，而不要使用长生命周期的会话 ID 来完成自动登录。

## session.use_only_cookies

`session.use_only_cookies = 1` ，虽然 HTTP Cookie 存在一些问题，但是它确实是实现会话 ID 管理的优选方案。尽可能的仅使用 Cookie 来进行会话 ID 管理，而且大部分应用也确实是只使用 Cookie 来记录会话 ID 的。如果 `session.use_only_cookies = 0` ，会话模块会在基于 Cookie 的会话 ID 初始化之前使用 GET / POST / URL 请求中的会话 ID 。

## session.use_strict_mode

`session.use_strict_mode = 1` ，此设置防止会话模块使用未初始化的会话 ID 。也就是说，会话模块仅接受由它自己创建的有效的会话 ID ，而拒绝由用户自己提供的会话 ID 。攻击者可以自行设置 Cookie 或者使用 JavaScript 注入的方式来设置会话 ID 进行攻击。启用 `session.use_strict_mode` 配置项可以阻止使用未经会话模块初始化的会话 ID 。攻击者可以使用自己的设备产生会话 ID ，也可以使用受害者的会话 ID 。攻击者也可以通过一些后续操作保证会话活跃。因此，启用 `session.use_strict_mode` 配置项可以降低这种风险。

## session.cookie_httponly

`session.cookie_httponly = 1` ，禁止 JavaScript 访问会话 Cookie 。此设置项可以保护 Cookie 不被 JavaScript 窃取。虽然可以使用会话 ID 来作为防范跨站请求伪造的关键数据，但是不建议这么做。例如，攻击者可以把 HTML 源代码保存下来并且发送给其他用户。为了安全起见，开发者不应该在 Web 页面中显示会话 ID 。

## session.cookie_secure

`session.cookie_secure = 1` ，仅允许在 HTTPS 协议下访问会话 ID Cookie 。如果你的 Web 站点仅支持 HTTPS ，那么必须设置此配置项。对于仅支持 HTTPS 的 Web 站点建议考虑使用强制安全传输技术。

## session.gc_maxlifetime

`session.gc_maxlifetime = 1440` ， `session.gc_maxlifetime` 来设置删除过期会话数据的时间周期。不建议依赖这个配置项来实现对于过期会话数据的删除，需要你自己来实现一套基于时间戳的会话数据生命周期管理机制。最好使用 `session_gc()` 函数来进行会话数据垃圾收集。如果是 Unix 操作系统，最好使用定时任务来执行 `session_gc()` 函数。会话数据删除的运行时机并不是精准的，带有一定的或然性，所以这个设置项并不能确保旧的会话数据被删除。虽然开发人员不能完全依赖这个设置，但是还是建议将其设置的尽可能的小。调整 `session.gc_probability` 和 `session.gc_divisor` 配置项可以使得过期的会话数据在适当的周期内被删除。如果需要使用自动登录的功能，请使用其他更加安全的方式自行实现，而不要通过使用长生命周期的会话 ID 来实现。

## session.use_trans_sid

`session.use_trans_sid = 0` ，如果有需要，可以使用会话 ID 透传机制。但是，禁用会话 ID 透传机制可以 避免会话 ID 被注入以及泄漏，有效的提高会话安全性。会话 ID 可能在浏览器书签或者保存下来的 HTML 源代码中被泄漏。

## session.trans_sid_tags

`session.trans_sid_tags = "a=href,area=href,frame=src,form="` ，一般情况下，默认值就可以，你无需重写不需要的标签。

## session.trans_sid_hosts

`session.trans_sid_hosts = ""` ，这个配置项设定允许进行会话 ID 透传的主机白名单。请勿在其中加入你不信任的主机。如果此配置项为空，则仅允许 `$_SERVER['HTTP_HOST']` 的站点进行会话 ID 透传。

## session.referer_check

当启用 `session.use_trans_sid` 配置项的时候，这个设置可以降低会话 ID 注入的风险。如果客户端发送了 Referer 信息但是在配置项中并未找到该子串，则嵌入的会话 ID 会被标记为无效。需要注意的是，如果使用了 HTTPS 协议， 那么浏览器在发起请求的时候不会包含 Referer 请求头。建议启用此配置项，虽然它并不是可靠的安全措施。

## session.cache_limiter

`session.cache_limiter = nocache` ，确保对于已经认证的会话，其 HTTP 内容不会被浏览器缓存。应该仅针对公开内容允许缓存，否则将会面临内容泄露的风险。即使 HTTP 内容不包含敏感数据，也可以把它设置为 `session.cache_limiter = private` 。 注意，这可能会导致客户端缓存私有数据。仅在 HTTP 内容中不包含任何私有数据的时候，可以设置为 `session.cache_limiter = public` 。

## session.sid_length

`session.sid_length = 48` ，更长的会话 ID 可以得到更高的安全强度。

## session.sid_bits_per_character

`session.sid_bits_per_character = 6` ，即使会话 ID 的长度设定不变，更高的会话 ID 比特位设置也会产生安全性更高的会话 ID 。

## session.hash_function

`session.hash_function = sha256` ，高强度的哈希算法可以生成更高安全性的会话 ID 。