我有两个关于php SESSIONs和cookies的基本问题
1)服务器如何知道会话何时终止?或者什么时候摆脱session_id和info等(也就是说,如果没有调用session_destroy)
2)在客户端存储一个cookie,其中包含服务器用来识别个人的唯一会话ID,如果有人要访问该会话ID,他们可以访问所有相同的信息吗?除了简单地检查会话信息之外,是否还需要额外的安全级别才能识别用户?
答案 0 :(得分:1)
Session基本上是一堆数据,存储在服务器上。客户端通过会话ID识别并匹配特定会话,存储在会话中,客户端位于cookie中,默认名称为PHPSESSID
。 (您可以在浏览器中找到它的值,或者在PHP中使用session_id()
函数。)如果浏览器删除了此cookie,则会话ID在客户端丢失,客户端无法获取其他数据存储在服务器上的会话中。这些数据最终会被垃圾收集器删除。
每次调用session_start()
时都会以某种可能性调用垃圾收集器。概率等于gc_probability
/ gc_divisor
。如果会话的周期超过gc_maxlifetime
秒,则垃圾收集器会删除会话数据。您可以在phpinfo()
输出中检查所有这些值,或使用例如ini_get('session.gc_maxlifetime')
。这与服务器上的会话数据有关。现在关于客户。
会话配置包含值session.cookie_lifetime
。引用PHP manual:
session.cookie_lifetime指定发送到浏览器的cookie的生命周期(以秒为单位)。值0表示"直到浏览器关闭。"默认为0。
0有特殊意义。它告诉浏览器不要将cookie存储到永久存储器中。因此,当浏览器终止时,会立即删除会话ID cookie。如果开发人员设置为0以外,则可能允许其他用户使用会话ID。大多数应用程序应该使用" 0"为了这。如果需要自动登录功能,请实施您自己的安全自动登录功能。不要使用会话ID。
您可以使用以下任何一项检查设置:
phpinfo()
,在session.cookie_lifetime
部分查找session
。session_get_cookie_params()['lifetime']
ini_get('session.cookie_lifetime')
基本上,如果会话cookie生存期为0,浏览器会在关闭时删除它,并且客户端将失去对会话数据的访问权。
是。只要(任何)客户端知道ID并且服务器上没有删除会话数据,客户端就可以访问它。
这取决于您的申请。获取会话ID并非易事,需要拦截通信或直接访问客户端数据。使用基于TLS的加密连接可以防止拦截。获取客户端数据需要一些恶意软件。
This article描述了用于用户身份验证的更安全的cookie实现。简而言之,虽然它仍然没有阻止cookie hijacking,但它为您提供了检测它的方法,通知用户并防止被盗cookie被重复使用。
Another article列表提供了有关用户身份验证的良好实践的更完整概述。像往常一样,安全性要求整个项目以安全的方式实施,而不仅仅是一个看似关键的部分。但如果我的建议,不要过分。对于每个项目的特定要求,努力应该是合理的。