Jan 06 2006

浅谈HTTP中的Session与Cookie

Category: 技术ssmax @ 11:08:01

session是保存在服务器端没错,但是要知道哪个用户是使用什么session,通过http协议这么知道的呢?

举个例子,服务器是resin,sessionid格式是使用cookie,session失效期是30分钟,这些可以通过服务器配置文件resin.conf设置:

<session-config>
        <session-max>4096</session-max>
        <session-timeout>30</session-timeout>
        <enable-cookies>true</enable-cookies>
        <cookie-domain>yourdomain</cookie-domain>
        <enable-url-rewriting>true</enable-url-rewriting>
</session-config>

进去一个使用session的jsp页面,检查response头,发现:
Set-Cookie: JSESSIONID=b5a86TcEnktd; domain=yourdomain; path=/
第一次访问的时候jsp发现这个请求没带有JSESSIONID,所以生产一个,并且set进去浏览器的cookie里面

然后第二次访问这个页面(不关闭浏览器)浏览器发现有这个cookie,对应这个domain和path,ok,
请求头包括这一行:
Cookie:  JSESSIONID=b5a86TcEnktd
服务器通过这个JSESSIONID到session池里面拿session,如果拿到,证明是有效的session(因为命名随机,所以很难撞),如果没有这个session,就证明sessionid无效,生成一个新的session,然后想上面一样set进cookie

此时关闭浏览器,再打开,访问同样的页面,由于浏览器发现刚才那个cookie已经过期(存活期是浏览器期限),所以请求头并没有加上Cookie:  JSESSIONID=b5a86TcEnktd这一行,服务器解释这个请求,找不到JSESSIONID,自然帮他生产一个新的,然后又通过response设置成Set-Cookie。
Set-Cookie: JSESSIONID=adqOWayWfard; domain=yourdomain; path=/

好了,这个cookie的id是adqOWayWfard,原来的那个是b5a86TcEnktd,服务器并不知道b5a86TcEnktd已经没有人使用了,所以它还是会存活到30分钟后才消失,但是此时如果有请求是使用了b5a86TcEnktd的JSESSIONID,服务器会认为是有效请求,此时的session就已经被别人盗用了~当然这种可能性很低。

但是楼主说的情况,是外部提交的问题,用session是解决不了的!
只要你访问过一次需要提交的页面,生成可提交的session,记录sessionid,然后在30分钟内,你可以用这个session提交,你可以用程序set入去http请求里面,也可以用url代session方式:
http://yourdomain/test.jsp;jsessionid=b5a86TcEnktd
服务器一样可以拿到session。
当然你可以在session里面设置一个值,比如时间,没session和间隔太短的都不许提交,这样可能有效一点,呵呵,但是httpservletreaeust.getsession(false)这个东西是没有用di,只要有sessionid就能让他get出东西出来,哈哈。

记住,http协议能让人提交,就不能防止别人用同样的http协议提交,因为http协议是没有验证和数据持续的东西的,所有东西都是通过request header、body来传送,只要我能写程序,分析你的http响应,然后做到和平常人的提交一模一样,你是没有办法禁止的,就算使用了图片验证码,我也可以取得图片来分析,得出验证码提交,这就是为什么现在图片验证码要很多干扰线、gif动态,为的就是防止ocr分析,只是数字的ocr识别率是很高的,也很容易做(用java,做过一个),所以我们要干扰干扰干扰~~~~

Leave a Reply