【发布时间】:2009-06-19 11:37:35
【问题描述】:
在我的经典 ASP 应用程序中,当客户端关闭浏览器时,与 ASP 会话 ID 相关的 cookie 会丢失,即使会话没有超时。所以……
如何让 ASP 会话 ID cookie 在客户端关闭浏览器的情况下保持不变?
【问题讨论】:
标签: session asp-classic
在我的经典 ASP 应用程序中,当客户端关闭浏览器时,与 ASP 会话 ID 相关的 cookie 会丢失,即使会话没有超时。所以……
如何让 ASP 会话 ID cookie 在客户端关闭浏览器的情况下保持不变?
【问题讨论】:
标签: session asp-classic
当您启动新的浏览器会话并浏览到您的站点时,经典 ASP 会检测到没有 ASP 会话 cookie 并会为您创建一个新会话(正如您已经体验过的那样)。
会话 cookie 就是这样,它们在会话的整个生命周期内都存在。当您关闭浏览器时,会话 cookie 将被删除(即使您在服务器上的会话状态将作为孤立会话继续存在,直到 Session.Timeout 到期 - 除非您在 Session.Timeout 期间再次提供相同的会话 cookie)。
在新的浏览器会话/实例中延长 ASP 会话 cookie 的生命周期的唯一方法是使用浏览器/客户端上的脚本更改 cookie 的生命周期。
如果您希望跨浏览器关闭等事件管理状态,则需要实现自己的状态管理机制(例如将状态持久保存到数据库)并使用具有较长生命周期的常规 cookie(或滑动到期,您可以在服务器端脚本中的每个请求上将生命周期延长一小段时间)以匹配用户的状态。
编辑:
下面的文章有一个修改会话cookie的脚本(向下滚动到cookie过期):
但正如 Shoban 正确指出的那样,Session Fixation (OWASP) 存在风险。但是,您可以采取一些方法来保护自己免受这种情况的影响:
我还要添加一些警告,如果您的应用程序正在存储敏感数据(信用卡、财务、医疗等),那么我建议您不要这样做,并接受这样一个事实,即您的用户必须重新登录并开始一个新的会话。安全总比后悔好。
【讨论】:
“会话 cookie”是线索:当用户关闭浏览器时,他们正在结束会话。
服务器超时的存在是因为服务器无法知道用户结束了会话,所以它的工作原理是如果他们一段时间不回来,会话就必须结束。
如果你想要一个持久的cookie,你必须自己设置它;但是没有办法阻止用户结束他们的会话。
【讨论】:
您可以增加会话超时时间。
Session.Timeout[=nMinutes]
http://www.asp101.com/articles/john/sessionsend/default.asp
<%
Response.Cookies("firstname")="Alex"
Response.Cookies("firstname").Expires=#May 10,2012#
%>
这行不通??
【讨论】:
这不是设计的吗?
也许您想改用普通的 cookie?
【讨论】:
您需要保留会话 cookie,因为出于安全原因,您无法访问浏览器之间的会话(无论是两个不同的浏览器,还是同一个关闭并重新打开的浏览器)。
通常,您会在服务器端存储详细信息并使用包含简单 id 的客户端 cookie 来检索信息。
【讨论】: