| baorongabc 回复于:2003-07-06 11:12:22
|
[size=18:2e98cfc298][color=red:2e98cfc298][b:2e98cfc298]请大家都来谈谈自己的对session有关认识! [/b:2e98cfc298][/color:2e98cfc298][/size:2e98cfc298]
|
| 星月无痕 回复于:2003-07-06 22:26:36
|
不会
|
| wubai 回复于:2003-07-07 08:38:38
|
说的不错!
|
| redfox 回复于:2003-07-07 12:43:32
|
方便性也是一方面,用地址栏自然没有用session方便了;而且地址栏长度有限制的,session可以传数组,甚至大的对象都可以。
|
| baorongabc 回复于:2003-07-07 13:17:18
|
[color=red:03c3ca8536][size=24:03c3ca8536][b:03c3ca8536]对session的认识的补充![/b:03c3ca8536][/size:03c3ca8536][/color:03c3ca8536][b:03c3ca8536][color=red:03c3ca8536]session在各个窗口是如何运行。[/color:03c3ca8536][/b:03c3ca8536]
[b:03c3ca8536]我先来做个试验[/b:03c3ca8536][color=red:03c3ca8536]我php版本是4.02,[/color:03c3ca8536]
首先我们来建立两个文件。
test1.php
<?
session_start();
session_register("count");
echo $count=0;
?>
test2.php
<?
session_start();
echo $count++;
?>
[b:03c3ca8536]打开两个浏览器窗口,标记为A和B
在A浏览器的窗口中执行test1.php,这时我们应该看到浏览器中显示的值是0。这时在tmp目录下会生成一个文件名为sess_72449e735acfa944d629d05f12e26d81的文件。内容count|i:0;
继续在A浏览器的窗口中执行test2.php,并不断的刷新它,我们就会看到浏览器中的数值在不断的递增,这时在tmp目录下仍然是只有上面那个文件名,内容count的值变化了,说明我们的session是起作用的。我们继续看看其他的情况,在B浏览器的窗口中执行test2.php,没有显示,继续刷新,仍没有显示。这时在tmp目录下会生成一个文件名为sess_26c0deb5b640cd9d9466b174dc051816,内容为空!再打开第三个浏览器窗口C并在其中执行test2.php,也是没有显示,这时在tmp目录下会生成一个文件名为sess_8b6934cd6a2f5a60e3d1c4eca9b3609e。[size=18:03c3ca8536][color=red:03c3ca8536]这说明session不能跨窗口运行。并且每个窗户生成一个文件 [/color:03c3ca8536][/size:03c3ca8536]如果在A窗口用文件》》新建窗口得到窗口D时,刷新,浏览器中的数值在不断的递增 ,sess_72449e735acfa944d629d05f12e26d81 内容count的值变化了,[color=red:03c3ca8536][size=18:03c3ca8536]所以窗口具有继承性!session可以在 继承的窗口传递。[/size:03c3ca8536][/color:03c3ca8536] [/b:03c3ca8536]
[size=18:03c3ca8536][color=blue:03c3ca8536]可是问题有出来了,我把这两个文件上传到我网站做试验,
www.my8868.com
结果是不同的窗口也可以传递!我不知它的php版本是怎样以及php.ini是如何配置的, [/color:03c3ca8536][/size:03c3ca8536]
[size=18:03c3ca8536][color=green:03c3ca8536]后来我有发现,www.my8868.com网站上session的保存期好像是永远,我关掉所有连接此网站的窗口,重新打开网页,session的值还是保存着,电脑用户注销后,也是不消失,重新启动也一样,但同样是这些文件在我机子上执行,session的值消失了。这里又出[/color:03c3ca8536][color=red:03c3ca8536][size=18]来一个session生命周期的问题[/size:03c3ca8536][/color:03c3ca8536]。[color=green:03c3ca8536]这样session与cookie不是一样了吗,在我的印象中session的生命周期应该是从用户连上服务端网站到用户离开结束。如果session的生命周期可以变化,而且是需要cookie session的支持,又是读文件操作,效率不高,还不如用cookie实现有关功能,在我看来seesion没有什么作用,其他人有没有其他的看法![/color:03c3ca8536][/size]
[color=blue:03c3ca8536][size=18:03c3ca8536][b:03c3ca8536]我的留言版
http://www.my8868.com/second_folder1/message_board/message_board_index.php
的用户注册功能的实现,我首先想到是用session的机制,因为在以前的印象中seesion是服务器端,执行速度一定比cookie快,不需要受客户端的限制,(因为cookie在用户端关掉cookie支持后就不能用了)可是现在发现 session也需要cookie机制的支持,所以我真怀疑php中session的优越性!用户注册 ,网上购物,这些系统应该是用se'ssion的,可是.....
你们会选择用session还是cookie。[/b:03c3ca8536][/size:03c3ca8536] [/color:03c3ca8536]
|
| mfk21 回复于:2003-07-07 14:16:19
|
session用的好的话,还可以。如果用不好的话,问题真是多多啊,我是深有感触啊!
|
| daoker 回复于:2003-07-07 21:29:54
|
我一直用cookie
|
| redfox 回复于:2003-07-08 07:59:13
|
session的生命周期可以在php.ini修改阿。
|
| mostone 回复于:2003-07-08 13:18:32
|
session是针对每一个用户的,变量的值保存在服务器上,但是如何区分是哪个用户session变量呢,这里就有一个sessionID,这个值是通过用户的浏览器在访问的时候返回给服务器,当客户禁用cookie时,这个值也可能设置为由get来返回给服务器。目前,有的浏览器的sessionID不能跨页,有的可以,如IE,MYIE2对session的处理是不同的,后者只要你开过这个网站的页面,即使关闭后(指关闭子窗口,它是多页面浏览器),再重新打开,sessionID依然存在,而无需重新注册。sessionID是经过加密,加密算法比较复杂,被黑的可能性很小,而cookie是保存在客户机子上,安全性较差。另外,如楼上所说,session可以设置有效或无效,可手工建立,也可自动建立,可以设置过期时限。
另外,你所说的tmp可能只是环境变量而已,不是一个物理目录,可设置指向到用户物理的临时目录。
|
| tanghui21 回复于:2003-07-08 19:23:23
|
我也很想问这个问题 多谢楼主
|
| baorongabc 回复于:2003-07-09 10:16:25
|
[color=red:dcc878e49b][size=18:dcc878e49b]cookie和seesion的比较![/size:dcc878e49b][/color:dcc878e49b]
精灵王feming在置顶的有关cookie的两篇文章写得很好,对cookie的阐述的很清楚!希望大家也去看看!
但是她写道cookie存在下面这些问题:
[color=green:dcc878e49b]比如:MS IE+SERVICE PACK 1不能正确处理带域名和路径的Cookie,Netscape Communicator 4.05和MS IE 3.0不能正确处理不带路径和时间的Cookie。至于MS IE 5 好象不能处理带域名、路径和时间的Cookie。这是我在设计本站的页面时发现的。
第三个限制是在客户端的。一个浏览器能创建的Cookie数量最多为30个,并且每个不能超过4KB,每个WEB站点能设置的Cookie总数不能超过20个。 [/color:dcc878e49b]
[color=red:dcc878e49b][b:dcc878e49b]觉得是cookie的致命伤!这样在编程如何处理这些不兼容问题,不得不考虑用session。 [/b:dcc878e49b][/color:dcc878e49b]
[color=darkred:dcc878e49b][b:dcc878e49b]精灵alex2003 说:
首先,cookie 和session是密切相关的。session 和cookie相比有好处,但也有不好的地方:
如果服务器端是多台服务器,采用负载均衡方案,session就有问题了。因为不能保证每次请求都由同一台服务器处理,这样就会出现session丢失的情况。因此在这种情况下,还是应该使用cookie,这在大型网站上很常见。
希望大家注意!
显然session在多台服务器,采用负载均衡方案存在问题,那上面cookie的问题如何解决?[/b:dcc878e49b][/color:dcc878e49b]
|
| baorongabc 回复于:2003-07-09 12:13:11
|
[size=18:b17c42b8a1][color=red:b17c42b8a1]seesion几个函数的注意点:[/color:b17c42b8a1][/size:b17c42b8a1]
1 session_start()
本函式初始化一个新的 Session,若该客户已在 Session 之中,则连上原 Session。本函式没有参数,且传回值均为 true。
[b:b17c42b8a1]其实在tmp目录下创建像sess_26c0deb5b640cd9d9466b174dc051816的 存放session文件,是随机数,sess后的数可以用 session_id()取得[/b:b17c42b8a1]。
2 session_id()
存取目前 session 代号。
语法: string session_id(string [id]);
传回值: 字串
本函式可取得或者重新设定目前存放 Session 的代号。若无参数 id 则表示只有取得目前 Session 的代号,加上参数则表示将 Session 代号设成新指定的 id。输入及传回均为字串。
[b:b17c42b8a1]如果string [id]部位空,在tmp目录下创建将创建名string的文件。但如果在前面也用了session_start(),将同时产生两个文件,一个是随机名文件,一个是名string的文件。如果你不想产生随机文件,请去掉session_start(),注意session_id()函数的string好像的好像只能是数字和字母,不能是_#-:等特殊字符,这是我是试出来的。[/b:b17c42b8a1]
[b:b17c42b8a1]这里现在我有一个问题:
我用session_id(“文件名”)建立session后怎样取得此文件中session???
其实再用session_start(),因为如果当前的session已经存在,将不会产生新的文件。两者前后顺序是很讲究的。 [/b:b17c42b8a1]
|
| hillwood 回复于:2003-07-09 17:58:51
|
你这个介绍没有人能看到
|
| feming 回复于:2003-07-10 00:10:16
|
当开发人员使用Session变量时必须要求客户端浏览器支持接受cookies,当ASP开始一个Session,它将送一个cookies到客户端并带一个标示(SessionID).通过这个标示,ASP以后将可以确认Session并且因此来保持状态。所以,当你使用Session变量前,你需要确认cookies是否被接受。这里我讲解两个方法:
方法一:
无论何时你在两页之间,有一个非常简单可靠的方法:请求一个SessionID在第一页,传递它到下一页。与这一页请求到的SessionID比较。相同说明客户端浏览器接受Cookies;不同则不接受。很简单吧。
比如你可以在第一页中放一个(hidden field),并把SessionID写入它。提交后,从页面数据中取出SessionID.像这样:
<form name="Form1" method="post" action="sessions2.asp">
UserName:<input name="username"><br>
Password:<input name="userpassword">
<input type="hidden" name="theSessionID" value="<%=Session.SessionID%>"><br>
<input type="submit" value="Submit">
</form>
在第二页中我们来判断SessionID是否相同。
<%
dim theSessionID
theSessionID = Request.Form("theSessionID")
If theSessionID = Session.SessionID Then
"当二者相等时,则cookie功能开启
Response.Write "Cookie已开启"
Else
"若二者相等时,则cookie功能关闭
Response.Write "Cookie没有开启!"
End If
%>
方法二:
也可用这种方法,首先在一个页面里写入一个cookie,如:
<%
Response.Cookies("status")="onoroff"
%>
在第二页里读出此cookie:
<%
if Request.Cookies("status")="" then
"当cookies("status")里没有值时,则cookie功能没有开启
Response.Write "Cookie没有开启!"
else
"当cookies("status")里有值时,则cookie功能开启
Response.Write "Cookie已开启"
end if
%>
|
| alex2003 回复于:2003-07-10 09:24:17
|
首先,cookie 和session是密切相关的。session 和cookie相比有好处,但也有不好的地方:
如果服务器端是多台服务器,采用负载均衡方案,session就有问题了。因为不能保证每次请求都由同一台服务器处理,这样就会出现session丢失的情况。因此在这种情况下,还是应该使用cookie,这在大型网站上很常见。
希望大家注意!
|
| baorongabc 回复于:2003-07-10 09:58:09
|
[color=red:2636295da6][size=18:2636295da6][b:2636295da6]session的生命周期有多长?如何设置? [/b:2636295da6][/size:2636295da6][/color:2636295da6]
浏览器结束时其生命周期也同时结束,但是档案仍然存在于 /tmp/(sess_???)
下次重新开浏览器时会重新分配 sessionID,如果你使用 session_id() 把以前的 ID 带回来,则会去读取残存在 /tmp 处的 sess_???, 取回你之前所有已经设定的参数
可以在 php.ini 里修改 session 档案残存的时间
session.gc_maxlifetime = 1440 ; after this number of seconds, stored
; data will be seen as 'garbage' and
; cleaned up by the gc process
默认是 1440 秒,24分钟
|
| baorongabc 回复于:2003-07-11 07:35:01
|
[color=darkred:5812b959ea][b:5812b959ea]我不知道这个论坛是用什么机制编程,我想应该是cookie机制吧!
在这里存在安全问题!
如果我在这个论坛,登录时,在【】是否自动登录 复选框中选择后,下一次我就打开网页后,就已经登录了,这时可以进行个人资料管理!
如果其他人,打开此网页,那他不是可以修改我个人资料。甚至把我密码改掉,那我用户不是被人 盗用 了吗? [/b:5812b959ea][/color:5812b959ea]
[color=darkred:5812b959ea][b:5812b959ea]还有这个论坛存在一个格式化显示问题!
给对空格的处理没有处理好,连续的空格将变成一个, 顶格空格被去掉!
处理方法很简单,只要加个字符处理函数对从数据库中取出内容字段进行处理就行!! [/b:5812b959ea][/color:5812b959ea]
|
| tjyihui 回复于:2003-07-13 20:45:41
|
采用cookie时如果设置不当会出现一些安全隐患
因为cookie是保存在客户端的,凡是使用这台机器的人都可以查看到cookie的内容,如果在设置cookie时直接写入没有加密的密码(如www.deskcity.com就是这样),那么很容易被别人盗取,即便采用一些加密方法如base64,md5,如果密码设置得太简单,也会被穷举法所破解。
更何况还有通过设置本机的host文件来进行cookie欺骗以及针对cookie的跨站脚本攻击(详细内容可见7月份的《黑客防线》)等等。
可以说有关cookie的安全问题就够研究一阵的了!
|
| redfox 回复于:2003-07-14 08:43:17
|
session更安全些,且便于用程序控制,用cookies总有一种不受控制的感觉,缺乏安全感 
|
| benchozhang 回复于:2003-07-18 22:55:34
|
[quote:6dd9bd7330="baorongabc"][/quote:6dd9bd7330]
我按照以上测试程序,即
test1.php
<?
session_start();
session_register("count");
echo $count=0;
?>
test2.php
<?
session_start();
echo $count++;
?>
测试步骤也一样,
在A浏览器的窗口中执行test1.php,这时我们应该看到浏览器中显示的值是0。这时在tmp目录下会生成一个文件名为sess_72449e735acfa944d629d05f12e26d81的文件。内容count|i:0;
“继续在A浏览器的窗口中执行test2.php,并不断的刷新它,我们就会看到浏览器中的数值在不断的递增,这时在tmp目录下仍然是只有上面那个文件名,内容count的值变化了,说明我们的session是起作用的。”
这个步骤中,在A浏览器的窗口中执行test2.php,并不断的刷新它,并不是预料中的显示不断增加的数值,而是什么也没显示,就是说A中注册并赋值的session并没有带到test2.php,而是每一次刷新,在temp下都生成一个session的文件。在A浏览器的窗口中执行test1.php,不断刷新,也是每一次刷新,再temp下都生成一个session的文件。请问为什么会这样不断生成session文件呢?是不是我的session有问题?
|
| baorongabc 回复于:2003-08-07 16:51:22
|
――――test.php文件―――――――――――――
<?
session_id("aa");
session_start();
session_id("bb");
session_start();
$s_id=session_id();
session_register("s_user_id");
$s_user_id=1;
echo $s_id."<br>";
?>
<a href="test1.php">test1</a>
―――test1.php文件――――――――
<?
session_start();
$s_id=session_id();
echo $s_id."<br>";
?>
session_start()函数如果客户不在session之中时初始化一个新的session,若该客户已在session之中,则连上原session。本函式没有参数,且传回值均为 true。
session_id(string [id])本函式可取得或者重新设定目前存放session的代号。若无参数id 则表示只有取得目前session的代号,加上参数则表示将session代号设成新指定的id。输入及传回均为字串。
session_register(string name)本函式在全域变数中增加一个变数到目前的session之中。参数 name 即为欲加入的变数名。成功则传回 true 值。如果客户不在session之中时初始化一个新的session。
在session_start()和session_register(string name) 初始化一个新的session的id値可以由session_id(string [id])控制。如果不加session_id(string [id]),生成的session_id値为形如74a574990ea6f81da62cc4337877eabe的随机数。
所以像上面的程序的结果是:
在session存放的目录下生成sess_aa 和sess_bb两个文件,sess_aa文件中无参数,sess_bb文件中s_user_id|i:1;
如果把 session_id("aa");
session_start();
session_id("bb");
session_start();
变成
session_start(); ――― 句1
session_id("aa"); ――― 句2
session_id("bb"); ――― 句3
session_start(); ――― 句4
在session存放的目录下会生成一个像sess_74a574990ea6f81da62cc4337877eabe文件(不一定就是这个値)和sess_bb两个文件。因为句1产生sess_74a574990ea6f81da62cc4337877eabe文件,句2设置session_id的値被句3代替,即session_id的値为bb,所以句4生成sess_bb文件。
这些我已经很清楚明白了,但是这里我存在一个问题!在点击test.php超级连接到test1.php时echo $s_id."<br>";$s_id値为aa,而不是bb,这使我感到意外。似乎session_id("bb")没有把当前的session_id的値变成bb还是保留为aa。我现在真的还找不到原因。请大家帮忙!
|
| arccreator 回复于:2003-08-08 16:44:24
|
如果你使用 sniffer 监听你的浏览器作了些什么,你抓就清楚了,
当你访问一个用session 的站,同时在自己机子上建立一个cookie,cookie的名字是phpsessid=2323.......324df. 这个值和服务器上的session id 相符的文件里存放的是你的信息,如果黑客能抓到你的http请求包,伪造一个,就相当于使用了你的浏览器了
|
| willsee 回复于:2003-08-08 17:08:16
|
是啊,我现在也在学php
发现cookie和seesion的问题最多
哎,,,,,,,,
现在卡在这里了,好文章,希望我以后有
问题可以找你
|
| kevinlei 回复于:2003-08-15 06:35:45
|
我是尽量不用SESSION,这东西真的不是想象中的那么好用,我感觉,一般情况下COOKIE基本上够用了。我想要是W3C把COOKIE的标准扩展一下,应该就没SESSION什么事了。
|