正确理解 Session 与 会话安全

Session 在中文里通常被翻译为会话.
启用会话后, 服务器就会为你指定一个唯一的 Session ID , 它就像是身份证号码,服务器通过它识别用户身份,用户的各种变量都在服务器上,客户端只要保留 Session ID 就可以了。

服务器如何识别 Session ID 呢,使用身份证的时候,我们使用了一个卡片,而不是直接说出号码。同样,服务器识别 Session ID 也要有一定的载体, 这个载体有两种:1、cookie 2、传送过来的链接地址。
Session ID 可以借助 cookie 保存,也可以在链接地址上直接传送。

Session 安全问题是与这两个载体有关的。与伪造身份证的卡片的手段类似,如果你的号码被别人知道了,入侵者会尝试修改他自己 cookie 的内容(Session ID),或者直接用地址发送 Session ID ,这样,连接到服务器时,服务器可能会将他认作是合法用户。

作为入侵者,这里面有几个较为困难的部分:
1、Session ID 是随机的长长的字符串,通常是很难通过猜测被找到的。
2、Session ID 有生存周期,时间长了,比如30分钟(这个值服务器可以控制)将失效。

通常我们是用 cookie 文件保存 Session ID 的,如果你在同时访问一个合法网站和一个恶意网站,恶意网站有可能读取到你的 Session ID (这个我没有验证)。另外,没有加密的信息可能在传送过程中被人截取,造成 Session ID 泄露。一个大型网站,同时在线用户数量巨多,Session ID 可能被入侵者随机猜中(这个我没有验证)。还有一种情况,用户将自已的 Session ID 用 email 发送给别人。
有人提出建议,用户退出时就删除 Session ID ,我想也不能保证入侵者在你未退出时就尝试盗用 Session ID 。

总之,我的意思是就像你的身份证号码通常有许多人知道一样。寄希望于 “Session ID 不会被别人发现” 无法保证你的会话安全。

Session 提供了许多参数和设置方法,使你的会话安全,我们要做的是根据需求正确的设置,并正确检查各种提交的变量。

对于 PHP 的会话,我们先忽略 php.ini 中相关参数的设定,说说在默认设定下,程序编写时的防范方法:
1、验证用户的使用环境[浏览器和 IP 地址]。
分配给用户 Session ID 时,同时探明用户使用的浏览器和 IP 地址,作为验证依据,使非法用户不能进行 Session ID 欺骗。
2、正确处理 Session 变量。
当用户注销时,立即删除 Session ID 。并设置好 Session 的生存周期,过期就自动删除。

我们可以使用函数 session_set_save_handler 自定义 Session 的行为。

在 php.ini 中也有一些参数与 Session 有关,比如设定
session.auto_start 指定会话模块是否在请求开始时自动启动一个会话。
session.gc_probability
session.gc_divisor 合起来用来管理 gc(garbage collection 垃圾回收)进程启动的概率。
session.gc_maxlifetime 指定过了多少秒之后数据就会被视为“垃圾”并被清除。
session.use_cookies 指定是否在客户端用 cookie 来存放会话 ID。
session.use_only_cookies 指定是否在客户端仅仅使用 cookie 来存放会话 ID。
session.cookie_lifetime 以秒数指定了发送到浏览器的 cookie 的生命周期。值为 0 表示“直到关闭浏览器”。
[没写完,以后接着写]

本文共有 0 条评论正确理解 Session 与 会话安全


  1. 没有评论

请留下您的评论: