Heim  >  Artikel  >  php教程  >  php5 的 session 详解之三:SESSION 安全

php5 的 session 详解之三:SESSION 安全

WBOY
WBOYOriginal
2016-06-06 19:47:131200Durchsuche

会话模块不能保证存放在会话中的信息只能被创建该会话的用户看到。根据其存放的数据,还需要采取更多措施来主动保护会话的完整性。 评估会话中携带的数据并实施附加保护措施通常要付出代价,降低用户的方便程度。例如,如果要保护用户免于受简单的社交策略侵害(

       会话模块不能保证存放在会话中的信息只能被创建该会话的用户看到。根据其存放的数据,还需要采取更多措施来主动保护会话的完整性。

       评估会话中携带的数据并实施附加保护措施通常要付出代价,降低用户的方便程度。例如,如果要保护用户免于受简单的社交策略侵害(注:指在 URL 中显示的会话 ID 会被别人在电脑屏幕上看到,或被别的网站通过 HTTP Referer得到等),则应该启用 session.use_only_cookies。此情形下,客户端必须无条件启用 cookie,否则会话就不工作。有几种途径会将现有的会话 ID 泄露给第三方。泄露出的会话 ID 使第三方能够访问所有与指定 ID 相关联的资源。

       第一,URL 携带会话 ID。如果连接到外部站点,包含有会话 ID 的 URL 可能会被存在外部站点的 Referer 日志中。

       第二,较主动的攻击者可能会侦听网段的数据包。如果未加密,会话ID会以明文方式在网络中流过。对此的解决方式是在服务器上实施SSL并强制用户使用。默认情况下,所有与特定会话相关的数据都被存储在由INI选项session.save_path 指定的目录下的一个文件中。对每个会话会建立一个文件(不论是否有数据与该会话相关)。这是由于每打开一个会话即建立一个文件,不论是否有数据写入到该文件中。注意由于和文件系统协同工作的限制,此行为有个副作用,有可能造成用户定制的会话处理器(例如用数据库)丢失了未存储数据的会话。上面介绍的函数下文将会用到,但还有一些有关 session 的函数也介绍一下:

session_encode

函数功能:sesssion 信息编码

函数原型:string session_encode(void);

返回值:字符串

功能说明:返回的字符串中包含全局变量中各变量的名称与值,形式如:a|s:12:"it is a test\";c|s:4:"lala"; a 是变量名 s:12 代表变量 a 的值"it is a test 的长度是 12 变量间用分号”;”分隔。

session_decode

函数功能:sesssion 信息解码

函数原型:boolean session_decode (string data)

返回值:布尔值

功能说明:这个函数可将 session 信息解码,成功则返回逻辑值 true

      Php5 不再使用 session_id,而是把它变成一个常量 SID,并保存在 cookie 中。如果客户端禁用了cookie,php 会自动通过 url 自动传动传递 SID,其条件是设置php.ini中的 session.use_trans_sid = 1。此时即使客户端即使禁用了 cookie也没关系了。

strip_tags() 来输出 SID 以避免 XSS 相关的攻击。

Session 跨页传递问题:

session 跨页传递需要考虑三种情况:

1客户端禁用了 cookie。
2浏览器出现问题,暂时无法存取 cookie
3 php.ini 中 的 session.use_trans_sid = 0 或者编译时没有打开--enable-trans-sid选项
       为什么会这样呢?下面解释一下原因:
       Session 文件分为两部分:session 变量保存在服务器端(默认以文件方式存储session);而 session id 则以 cookie 形式保存在客户端。(注意:session 默认是基于 cookie 的)。当用户的浏览器向服务器提出请求时,同时发送包含session id的cookie(默认情况下)。服务器根据客户端提供的 session id 来得到用户的文件,即保存在服务器端的 session 变量值。事实上,session id 可以使用客户端的Cookie 或者 Http1.1 协议的 Query_String(就是访问的 URL 的“?”后面的部分)来传送给服务器,然后服务器读取 Session 的目录......。也就是说,session id是取得存储在服务上的 session 变量的身份证。当代码session_start();运行的时候,就在服务器上产生了一个 session 文件,随之也产生了与之唯一对应的一个 session id,定义 session 变量以一定形式存储在刚才产生的 session 文件中。通过 session id,可以取出定义的变量。跨页后,为了使用 session,你必须又执行 session_start();将又会产生一个 session 文件,与之对应产生相应的session id( 注 : 又 会 产 生 是 有 条 件 的 , 如 果 用 户 没 有 禁 止 Cookie 的话,session id 是可以隐藏的传过去的,也就是说不会产生新的 session id,但如果禁止了 Cookie 的话,就需要手动传递 session id 来解决此问题了,见例 2)),用这个session id 是取不出前面提到的第一个session文件中的变量的,因为这个session id 不是打开它的“钥匙”。如果在 session_start();之前加代码session_id($session id);将不产生新的 session 文件,直接读取与这个 id 对应的 session 文件。PHP中的session在默认情况下是使用客户端的 Cookie 来保存 session id的,所以当客户端的 cookie 出现问题的时候就会影响 session 了。必须注意的是:

       session不一定必须依赖cookie,这也是session相比 cookie 的高明之处。当客户端的Cookie被禁用或出现问题时,PHP会自动把 session id 附着在 URL 中,这样再通过 session id 就能跨页使用 session 变量了。但这种附着也是有一定条件的,

其一:“php.ini 中的 session.use_trans_sid = 1 或者编译时打开打开了--enable-trans-sid 选项”;

其二:运行 PHP 的服务器必须是 unix/linux系统,windows 不具备此项功能。

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn