<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>精東·博客 &#187; session</title>
	<atom:link href="http://www.wemvc.com/tag/session/feed" rel="self" type="application/rss+xml" />
	<link>http://www.wemvc.com</link>
	<description>男人的胸怀是委屈撑大的。</description>
	<lastBuildDate>Tue, 10 Jan 2012 04:26:50 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>如何防止Session伪造攻击</title>
		<link>http://www.wemvc.com/205.html</link>
		<comments>http://www.wemvc.com/205.html#comments</comments>
		<pubDate>Sun, 17 Aug 2008 15:48:42 +0000</pubDate>
		<dc:creator>精东</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[cookie]]></category>
		<category><![CDATA[session]]></category>
		<category><![CDATA[安全]]></category>
		<category><![CDATA[攻击]]></category>

		<guid isPermaLink="false">http://www.wemvc.com/?p=205</guid>
		<description><![CDATA[什么是SESSION伪造攻击:
Session伪造攻击是一种非常流行的针对session的攻击方式.它之所以流行的主要原因是:它是一个攻击者获得一个有效的SESSION ID(标识符)最简单的方法.使用这种方法,可以模仿当前用户的SESSION ID,伪装成这个用户,然后进一步进行SESSION劫持攻击.
任何促使受害用户使用攻击者提供的SESSION ID的方法都可以称之为SESSION伪造攻击,最简单的例子就是在一个链接中嵌入SESSION标识符:
&#60;a href=&#8221;http://www.wemvc.com/login.php?PHPSESSIONID=123123&#8243;&#62;登录&#60;/a&#62;
受害者点击了这个链接后将会把SESSION ID设置为123123.而且如果受害者在这个时候继续登录,攻击者就能够劫持他的SESSION用来提升自己的权限级别.甚至在购物类型网站中盗取他人帐户钱财.
这种攻击方法有很多变体,有一些使用COOKIES来达到自己的攻击目的,例如我在前一篇博文中写到的利用COOKIE和SESSION联用实现session跨域,那里就是用COOKIE来存储SESSION ID的,攻击者伪造COOKIE也可以变成受害者的身份去登录他的帐户.幸运的是针对这些攻击的防范,php也给了我们非常简单易懂并且通用的方法来处理.无论什么时候,只要有权限级别的改变,如果一个用户登录的时候,就用session_regenerate_id()函数来重新生成SESSION ID,无论是用POST/GET或者COOKIE方式传递SESSION ID 这个函数都适用.
代码片段:
&#38;lt;?php
if(checklogin($user_name,$password){
$_SESSION['auth'] = TRUE;
session_regenerate_id();
}
?&#38;gt;
这样可以有效的避免SESSION伪造攻击,可以确保每个用户登录时(或者有权限提升时)都被分配新的随机的SESSION ID.
]]></description>
		<wfw:commentRss>http://www.wemvc.com/205.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>php中COOKIE与SESSION联用实现SESSION跨域</title>
		<link>http://www.wemvc.com/189.html</link>
		<comments>http://www.wemvc.com/189.html#comments</comments>
		<pubDate>Sun, 17 Aug 2008 14:41:17 +0000</pubDate>
		<dc:creator>精东</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[cookie]]></category>
		<category><![CDATA[session]]></category>

		<guid isPermaLink="false">http://www.wemvc.com/?p=189</guid>
		<description><![CDATA[大家都知道SESSION是不可以跨域的,也就是说: A.WEMVC.COM这个域的可执行文件不可以访问到B.WEMVC.COM的SESSION,这个是SESSION的特性,同样也是出于安全角度才这样的.
在一般情况下,一个网站只有一个域名,www.wemvc.com,但是也有些网站架构是由多个子域名组建的.所以就需要SESSION可以跨子域被访问到,这样才可以实现用户的跨域登录.就是说客户在A下登录的,同样B也同时登录了,不需要用户再次登录,同时也实现了参数的跨域传递.当然不可跨域的SESSION本身已经可以帮助我们做很多事情了,那么跨域后的SESSION呢.读到这里是否很激动人心,当然你也可能是正在为SESSION跨域而发愁而找到这篇文章的,同样也祝贺你.我们长话断说了,开始我们今天的课程:COOKIE与SESSION联用实现SESSION跨域.
首先让我们再重新温习下PHP中的COOKIE和SESSION:
COOKIE:
定义:
cookie 常用于识别用户。cookie 是服务器留在用户计算机中的小文件。每当相同的计算机通过浏览器请求页面时，它同时会发送 cookie。通过 PHP，您能够创建并取回 cookie 的值。PS:其中文名叫&#8221;曲奇&#8221;.
在PHP中用setCookie函数来设置COOKIE,该函数一共有7个参数(在此我要向曾经我面试过的一位同仁道歉,当时我把答案说成了6个,SORRY~,同时我也提醒广大作家尽快更新自己的文章,在PHP5.2.0版本中已经增加为7个参数.),这7个参数分别为 string $name [, string $value [, int $expire [, string $path [, string $domain [, bool $secure [, bool $httponly ]]]]]] .

 name  

The name of the cookie. 规定 cookie 的名称。

 value  

The value of the cookie.  This value is stored on the clients [...]]]></description>
		<wfw:commentRss>http://www.wemvc.com/189.html/feed</wfw:commentRss>
		<slash:comments>35</slash:comments>
		</item>
		<item>
		<title>PHP中的SESSION全面教程</title>
		<link>http://www.wemvc.com/194.html</link>
		<comments>http://www.wemvc.com/194.html#comments</comments>
		<pubDate>Sun, 17 Aug 2008 13:47:15 +0000</pubDate>
		<dc:creator>精东</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[session]]></category>

		<guid isPermaLink="false">http://www.wemvc.com/?p=194</guid>
		<description><![CDATA[一、session概述
session是什么，刚开始我也不明白，非专业词典翻译为会议，会议期。直到接触asp后才知道session是干什么的，有什么用。
作个不太恰当的比喻吧（虽然不恰当，但意义却是一样的），session就好象你和你女友(或妻子)之间的感情似的，session是你和网站之间的感情。
session在WEB技术中占有非常重要的份量。由于网页是一种无状态的连接程序，因此你无法得知用户的浏览状态。因此我们必须
通过session记录用户的有关信息，以供用户再次以此身份对web服务器提供要求时作确认，例如，我们在某些网站中常常要求用户登录，
但我们怎么知道用户已经登录了呢，如果没有session的话，登录信息是无法保留的，那岂不要让用户在每一页网页中都要提供
用户名和密码。
当然，session不光用于用户身份认证功能，还可能用于其它方面，以后我们会提到的。
session用中文来解释就是会话期。一个会话期开始于用户输入一个站点的网址时，结束于他离开这个站点时。
session最早出现在动态脚本语言Active Server Pages中，它的功能之强大，是一句话无法说清楚的。
当 php还在3.0版本时，session是它永远的痛。虽然php具有执行速度快，使用灵活，功能强大等优点，但因为session的问题，使很多站点的 开发放弃了php,至少我的老板是这样认为的。当时有很多php免费函数库提供在php3上实现session的方案，但都让人感觉不正宗。
就好象你花好几千大洋买的手机却配置一个很粗糙的草作的袋子一样，虽然功能是一样的，但总让人觉得别扭。php4的出现让php在session问题上
有了翻身的机会。虽然它的session实现还不是很理想(主要是效率问题),但毕竟是它自己实现的，而且可以实际使用了。
那 我们用session干什么呢，你说了半天，我用不上的话，你岂不有卖纸张之嫌。OK,我们来看看session有什么用:作过网站的人都有这样的体会， 在一页页面中的变量(在本章都指服务器端变量，下同)是不能在下一页中用的，虽然有一些办法可以实现，比如用form，urlstring等等
但 有些对于用户来说是不方便的，即使让form自动提交，但其中的延时在现今的网络状况下足以让人窒息,而这两种方法都明显加大程序员的负担。如果你正在开 发一个大型项目，那这些额外的负担是不能忽略的。而有了session就好办了，session中注册的变量可以作为全局变量使用。什么,全局变量?
好极了。这样一来，你知道有什么用了吧:最主要的用于用户身份认证,程序状态记录，页面之间参数传递。
说了它这么半天的好处，你已经动心了吧，先别高兴，它还有缺点呢:它是用文件保存的变量(当然效率不高了,虽然可以用别的方式，但
很麻烦的)，不能保存对象。与之相对的是，asp中的session可以保存对象变量，用内存变量来保存session变量。但为什么我们还选用php呢，呵呵,
为什么，你能从本书的开始看到这章，想必你也应该明白了吧,你还不明白，Faint,你再从头看起吧，我保证你成为PHP专家^_^。
session是怎样实现的呢？呵呵，你一定以为很高深吧，我来告诉你它的秘密。如果说只保存变量的话，很多读者都明白，这是很简单的，
但前面我们说过,http协议是一种无状态的连接，你怎么知道那个变量是谁的，这个变量又是谁的呢?在session实现中用cookie实现的。cookie
存在于客户端，也就是用户的机器中，里面保存着用户的session ID，也就是session号码,当用户的浏览器请求服务器时把session ID也一起送到
服务器，这样服务器就可以识别你是谁，也就可以把变量识别开了。这样我们就不难理解了,为什么有时session会失效了。不信的话，你可以试试:
在IE的&#8221;工具&#8221;菜单上有&#8221;Internet选项&#8221;菜单,打开后再选&#8221;安全&#8221;-&#62;&#8221;自定义级别&#8221;,将安全设置中的&#8221;允许使用每个对话cookies&#8221;设为禁用，再看看
session能不能用。这下明白了吧!不过php4在linux/unix平台上可以自动检查cookies状态，当cookies 不可用时，自动会把session ID
附带在url上进行传递。这是它在session方面比asp多的唯一的优点了。
二、php3,4中session的实现
在php3中是没有session这种东东的，但我们又需要，怎么办呢？别急，有很多人替你做了这些，这其中最有名的要算phplib了。你可以去国外下
载，也可以上国内大部分php站点下载。我们要做的第一件事是让phplib和php3结合在一起使它能工作。为了能实现这方面的功能，我们需要先安装phplib。
跟着我来做，很容易的(以下方法在win2000+php3.0.16+apache1.3.12+phplib7.2c+mysql3.23.21 for win32 上通过)
phplib最基本的功能包括用户认证，Session管理，权限及数据库的抽象化。
怎样使用phplib来实现session功能呢?
一、首先你将phplib解开，里面有一个目录叫&#8221;php&#8221;,将这个目录拷贝到apache的安装目录下。以下以笔者的机器为例:
我的apache安装在d:apache 目录下,我将上面的&#8221;php&#8221;目录拷贝到d:apache,并将phplib下的pages目录下的文件和目录一起拷贝到
d:apachehtdocs下，注意不带目录本身。
phplib的类库需要根据系统进行初始化，你可以修改local.inc文件，其中包含着一些基本参数，你可以根据自己机器的实际情况来进行修改。
将d:apachephpprepend.php3文件中的一段程序改为如下样子：
if (!isset( $_PHPLIB) or !is_array( $_PHPLIB)) {
$_PHPLIB["libdir"] = &#8220;d:/apache/php/&#8221;; //这儿改为你放phplib下php目录的路径
}
然后将d:apachephplocal.inc文件改如下:
class DB_Example extends DB_Sql {
var  $Host = &#8220;localhost&#8221;;//你的mysql数据库所在主机名
var  $Database = &#8220;test&#8221;;//数据库名
var  $User = &#8220;root&#8221;;//数据库用户名
var  $Password = &#8220;&#8221;;//数据库用户口令
}
最后一步执行解开的phplib目录中的stuff目录下的create_database.mysql文件,生成初始表。
我们说明一下phplib的工作原理，每一个使用phplib的页面首先必须可以找到运行phplib所必须类库文件，我们可以在php3.ini中设置auto_prepend
变量来支持，phplib分发包中包含一个prepend.php3文件，将auto_prepend指定为&#8221;d:/apache/php/prepend.php3&#8243;(带引号)后，各页面就会自动包含phplib类库，我们还可以
将phplib类库所在目录加进include变量中，以便可以找到这些文件，当然，最苯的办法就是指定phplib的绝对路径，这可不是个好主意,可移植性太差！
第二步，每一个使用phplib的页面中，你必须首先调用page_open函数进行初始化。这会告诉phplib，你现在或将来会用到状态保存。一个典型的
page_open例子如下：
&#60;?php
page_open(array(&#8220;sess&#8221; =&#62; &#8220;Example_Session&#8221;));
?&#62;
数组变量(sess)用来初始化一些状态保存对象，注意：必须使用phplib内置名(sess)，这些内置名是你在local.ini中所定义的，page_open
函数必须在页面内容输出到浏览器之前被调用。php3脚本最后应以page_close()结束，这将会将有关状态数据写回到数据库中，如果你忘了的话，
结果你应该能想到,哈哈，你的变量全丢了,可不要怪我没告诉你&#8230;
因为phplib使用了Cookies来保存状态信息，所以page_open()函数必须在页面内容输出到浏览器之前被调用， 这里的页面内容可以是任何HTML
信息或者空行，如果你发现了错误&#8221;Oops &#8211; SetCookie called after header has been sent&#8221;，这表明在page_open()之前向浏览器输出了些什么，
你要特别留意空行，因为非常难找到，典型的错误是在&#60;? 和 ?&#62;标记之间输出了空行，你应检查在local.inc和prepend.php3文件中是否包含了空行，
这也是一个非常容易出错的地方。为了减少出错的可能,我们可以这样书写初始化程序:
&#60;?
page_open(array(&#8220;sess&#8221; =&#62; &#8220;Example_Session&#8221;));
?&#62;
&#60;html&#62;
&#8230;..
&#60;/html&#62;
第三步，具体使用。
当一个用户访问了该网站后，随即用户的session就开始了，如果用户的浏览器支持cookie的话，将会建立一个session的id放入cookie，
这个唯一的ID是由PHP3随机生成，然后又用随机种子字串进行md5加密过了的，这里的cookie应该叫做session [...]]]></description>
		<wfw:commentRss>http://www.wemvc.com/194.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

