场景描述:网站需要一个功能,记录用户点击一个按钮的次数。在页面定义了一个服务器端按钮,设置一个session记录点击次数。直接在vs2010中调试,跟踪发现每次点击按钮session都被是null。
记录session使用:
<sessionState mode="StateServer" stateConnectionString="tcpip=127.0.0.1:42424" timeout="30"/>
根据msdn没有设置cookieless,默认的值是:UseCookies。
当前cookieless的值为6个,分别为:
AutoDetect,此模式.net会判断浏览器是否支持cookie。如果支持,则使用cookie记录用户数据。不支持,则使用url来记录用户数据。如过浏览器支持,但是用户设置浏览器禁用cookie则仍将使用cookie,这种情况下session会丢失。
UseUri,始终使用url记录用户信息。
UseCookies,始终使用cookie记录用户信息。默认方式。
UsedeviceProfile,.net根据System.Web.HttpBrowerCapabilities设置是否使用cookie。如果设置指示浏览器支持cookie,则使用cookie,否则在查询字符串中标识。
True,将session的标示符存在url中。
False,不将session的标示符存在url中。
总结起来,客户端存储网站session唯一标识有两种:cookie和Url。cookie,有可能被用户禁掉;url,要求站点上的链接是相对链接,并要求在会话开始时使用新查询字符串值对页进行重定向,而会话 ID 会在查询字符串中公开,因此可能被抽取出来用于实施安全攻击。
权衡大多数用户浏览器的默认设置,安全隐私级别是中级。此级别,会阻止没有精简政策的第三方cookie,和不安全的第一方cookie。第三方的cookie禁用会导致有多个子域的cookie,第一方的不安全cookie,不知道这个标准是什么?那位知道,可以告诉下。
接上面的问题,开始怀疑是cookieless的问题,尝试设置各个值。将其值设置为True,session值不再丢失,可是链接变成:
http://localhost:1236/(S(vdvftzo2gqaf21is2skcx1ih))/Account/Login.aspx
这个明显不行。如果将此网址粘贴下来,发给另外一个人,放在浏览器中极不安全,这就需要通过禁用会话标识符的回收来减少会话数据被多个客户端共享的可能性。 若要完成此操作,请将 sessionState 配置元素的 regenerateExpiredSessionId 特性设置为 true。参看http://msdn.microsoft.com/zh-cn/library/system.web.sessionstate.httpsessionstate.iscookieless.aspx
后经考虑ie的安全级别,第一方的cookie是允许的,为啥记不住呢?默认情况下,大多数网站都是要用cookie的。
最后创建一个iis站点,访问此页面发现session可以记住。同样的设置,为啥在vs中预览不行呢?
一个页面进行登录,登录成功记录session值。然后关闭此窗口,重新打开一个窗口,不是新建会话。验证,此session仍然存在。
http://msdn.microsoft.com/zh-cn/magazine/cc300500(en-us).aspx。现在seesion攻击一共有两种方式:
第一种,猜sessionid,这个很难。因为.net的sessionid是由随机的120-bit的长度的随机数,猜中的概率很小。
第二种,是盗取客户端的cookie获取的session,这样方式可以使用ssl安全套接字来处理,但是有的网站可能不支持安全套接字。即便是使用ssl,骇客也可以使用其它方式获取session id。
所以完全使session id不被盗是不可能,只能提高难度。