必须了解的session的本质有一点我们必须承认,大多数web应用程序都离不开session的使用。这篇文章将会结合php以及http协议来分析如何建立一个安全的会话管理机制。我们先简单的了解一些http的知识,从而理解该协议的无状态特性。然后,学习一些关于cookie的基本操作。最后,我会一步步阐述如何使用一些简单,高效的方法来提高你的php应用程序的安全性以及稳定行。我想大多数的php初级程序员一定会认为php默认的session机制的安全性似乎是有一定保障的,事实恰好相反 – php团队只是提供了一套便捷的session的解决方案提供给程序员使用,至于安全性的话,应该由程序员来加强,这是应用程序开发团队的责任。因为,这里面的方法很多,可以这么说吧,没有最好,只有更好。攻击的方式在不断变化,防守方也需要不断变招,所以,我个人认为php团队的做法还是比较明智的。无状态性Http是一种无状态性的协议。这是因为此种协议不要求浏览器在每次请求中标明它自己的身份,并且浏览器以及服务器之间并没有保持一个持久性的连接用于多个页面之间的访问。当一个用户访问一个站点的时候,用户的浏览器发送一个http请求到服务器,服务器返回给浏览器一个http响应。其实很简单的一个概念,客户端一个请求,服务器端一个回复,这就是整个基于http协议的通讯过程。因为web应用程序是基于http协议进行通讯的,而我们已经讲过了http是无状态的,这就增加了维护web应用程序状态的难度, 对于开发者来说,是一个不小的挑战。Cookies是作为http的一个扩展诞生的,其主要用途是弥补http的无状态特性,提供了一种保持客户端与服务器端之间状态的途径,但是由于出于安全性的考虑,有的用户在浏览器中是禁止掉cookie的。这种情况下,状态信息只能通过url中的参数来传递到服务器端,不过这种方式的安全性很差。事实上,按照通常的想法,应该有客户端来表明自己的身份,从而和服务器之间维持一种状态,但是出于安全性方面的考虑,我们都应该明白一点 – 来自客户端的信息都是不能完全信任的。尽管这样,针对维持web应用程序状态的问题,相对来说,还是有比较优雅的解决方案的。不过,应该说是没有完美的解决方案的,再好的解决方案也不可能适用所有的情况。这篇文章将介绍一些技术。这些技术可以用来比较稳定地维持应用程序的状态以及抵御一些针对session的攻击,比如会话劫持。并且你可以学习到cookie是怎样工作的,php 的session做了那些事情,以及怎样才能劫持session。HTTP 概览如何才能保持web应用程序的状态以及选择最合适的解决方案呢?在回答这个问题之前,必须得先了解web的底层协议 – Hypertext Transfer Protocol (HTTP)。
当用户访问http://example.com这个域名的时候,浏览器就会自动和服务器建立tcp/ip连接,然后发送http请求到example.com的服务器的80端口。该个请求的语法如下所示:不能发代码格式,详细的请看这篇文章吧: http://www.360weboy.com/php/session/%E4%BD%A0%E5%BF%85%E9%A1%BB%E4%BA%86%E8%A7%A3%E7%9A%84session%E7%9A%84%E6%9C%AC%E8%B4%A8.html

解决方案 »

  1.   

    这个编辑器这么没html源代码形式编辑的,郁闷的。你看这个链接: http://www.360weboy.com/php/session/%E4%BD%A0%E5%BF%85%E9%A1%BB%E4%BA%86%E8%A7%A3%E7%9A%84session%E7%9A%84%E6%9C%AC%E8%B4%A8.html
      

  2.   

    学习呀
    session有时候确实还不错哦
      

  3.   

    MrCeffoo,站点上面的评论,不好用吗?
      

  4.   

    了解session的本质 - http://www.360weboy.com/php/session-cookie/session_essence.html
      

  5.   

    了解session的本质 - http://www.360weboy.com/php/session-cookie/session_essence.html这篇文章的内容已经更新了!有兴趣的朋友可以继续读下!会尽快将这篇文章写完!
      

  6.   

    谢谢你的评论。后续,有时间,我会写各种具体的针对session的攻击方式,以及一些有效的防御措施。 有兴趣的话加下360weboy的qq群以及关注下360weboy的新浪微博等。这样的话,只要有新的文章写好了,就会推送给你。大家可以在一起讨论。
      

  7.   

    该文章已经收尾写完,感兴趣的继续看下!http://www.360weboy.com/php/session-cookie/session_essence.html谢谢你的耐心阅读,希望本篇入门篇文章对你有所帮助,感兴趣的话可以加入360weboy的qq群-197642724,后者关注360weboy的新浪或者腾讯微博,大家在一起分享讨论开发中的技术以及思想。
      

  8.   

    各位好,先准备写一篇 - web流行攻击方式之一 – Cross-Site Request Forgeries然后再写关于session攻击的文章http://www.360weboy.com/php/security/csrf.html
      

  9.   

    感觉session是不是存的东西太多对服务器消耗太大了呀...还是和cookie一起用好一些,特别是购物车这个东西,可是如果浏览器开无痕了该怎么办呢?!各位有什么好办法吗?
      

  10.   

    你可以看各大开源的电子商务系统,推荐国外的magento,,tomatocart,opencart,prestashop等,当前用户购物车里的数据都是存在服务器端的session中的,存储session在数据库中,不是默认的存贮在服务器端文件中。 如果用户禁用cookie,只有通过get或者post数据来传递session I'd.
      

  11.   

    楼上的正解,session用处实在是太大了
      

  12.   

    还是csdn的社区好,我在51cto的社区里,发个文章好麻烦,还要审核,带有文章博客地址还会被删除!
      

  13.   

    以下文章由360weboy原创撰写, 原文地址:Php session内部执行流程的再次剖析。 360weboy – 专注php web开发 | web前端开发。希望本篇文章对你有所帮助,感兴趣的话可以加入360weboy的qq群-197642724,或者关注360weboy的新浪或者腾讯微博,大家在一起分享讨论开发中的技术以及思想,如发现文章有什么不对之处,请在评论中及时指出,如果确实有问题,我会及时纠正。近期再次分析了php session内部的执行流程,我将在这篇文章中简要地概括出php内部关于session的执行步骤。首先php中的session其实就是作为一个扩展载入到php内核中的。我们可以将它理解成一个扩展就可以了。当session扩展被载入时,php会调用内部核心函数来获取处理session的save_handler – 也就是存储读取session数据的接口类或者函数。 Php默认地是通过写或者读取文件来处理session数据的。但是,php也提供了user自定义的方式 – 也就是自定义处理session数据的接口,可以通过session_set_save_handler函数来注册。关于这方面,后续我会详细写一篇文章。同时,php会判断session.auto_start是否已经在配置中默认开启。如果开启了session.auto_start,PHP便会调用内部函数自动开启Session功能。以上,就是session扩展被载入时php内部所处理的两件事情。接下来,php在启动session的时候,如果发现请求的Cookies,Get,Post中不存在session id,说明这是客户端的第一次访问,php会自动调用php_session_create_id函数创建一个唯一的session id,并且在http response中通过set-cookie头部发送给客户端保存(在客户端cookie被禁用的情况下,php也可以自动将session id添加到url参数中以及form的hidden 字段中,这需要将php.ini中的session.use_trans_sid设为开启,也可以在运行时调用ini_set来设置这个配置项)。相反,如果请求中已经携带了session id,那么php会做以下几件事情:1.从cookie中获取Session ID
    2.调用save_handler的open接口打开存储上下文
    3.如果读取不到对应的session id, 生成新的Session Id
    4.注册$_SESSION和$_HTTP_SESSION_VARS全局变量,$_SESSION和$_HTTP_SESSION_VARS会被注册为同一个数组接着调用save_handler的read接口读取Session数据,如果是使用files方式存储的话,就从文件中读取Session数据,数据库方式的话,就从数据库中读取。 读取完毕后会把读到的数据写入到$_SESSION数组中
    最后,当一个请求执行完毕时,php会调用内部函数获取$_SESSION数组中的值,然后调用php_session_encode将其系列化后,通过调用save_handler的write接口将session系列化数据存储起来。以上大致按照顺序列出了php session的内部执行流程。至于php的源代码,我想就不贴出来了。以上由360weboy原创撰写, 原文地址:Php session内部执行流程的再次剖析。 360weboy – 专注php web开发 | web前端开发。希望本篇文章对你有所帮助,感兴趣的话可以加入360weboy的qq群-197642724,或者关注360weboy的新浪或者腾讯微博,大家在一起分享讨论开发中的技术以及思想,如发现文章有什么不对之处,请在评论中及时指出,如果确实有问题,我会及时纠正。