经典ASP:重用ASPSessionID

时间:2012-05-21 20:12:48

标签: asp-classic sessionid

我知道如何在ASP.NET中处理这个问题,但有没有办法强制清除经典ASP会话ID?它是一个随机生成的ID,如ASPSESSIONIDG32423E,似乎在RESPONSE.COOKIES集合中不可用,因此我无法清除它。我们还有一个类ASP站点,最近审计发现用户注销后会重复使用相同的会话ID。

更多澄清:

首次访问页面,我在响应中的代理编辑器中看到了这一点:

Set-Cookie:ASPSESSIONID = PUYQGHUMEAAJPUYL; path = / Webapp

注销后,我调用Session.RemoveAll和Session.Abandon,然后将用户重定向到登录页面。此时我应该看到一个新的Set-Cookie,它具有不同的SessionID值。相反,我没有获得新的cookie,新的登录会话重用原始会话cookie。这是一个审计发现,我们必须以某种方式解决,但似乎没有办法控制这一点。

3 个答案:

答案 0 :(得分:3)

所以我确实为此提出了如下解决方案。我添加了两个名为Start.asp和Start2.asp的页面。原始登录页面已更改为检查现在在Start2.asp上设置的post变量,因此如果login.asp没有看到该post变量,则会重定向到Start.asp。 Start.asp通过将ASPSessionID设置为0来使ASPSessionID无效。关键是使用Response.AddHeader“Set-Cookie”来执行此操作,因为Response.Cookies(“ASPSESSIONID ...”)给出了一个您无法访问的错误元素:

Start.ASP的代码

<%
If instr(Request.ServerVariables("HTTP_COOKIE"), "ASPSESSIONID") > 0 Then

    Dim Allcookies

    AllCookies = Split(Request.ServerVariables("HTTP_COOKIE"),";")
    For i = 1 to UBound(AllCookies)

        If instr(AllCookies(i), "ASPSESSIONID") > 0 Then
            Response.AddHeader "Set-Cookie", Left(AllCookies(i),instr(AllCookies(i),"=") -1) & "=0; path=/;secure;httponly"
        End if

    Next 
End if

Response.Redirect("start2.asp")
%>

接下来,它调用Start2.asp来查找所有ASPSEssionID cookie并附加Secure; httponly(我不得不为另一个发现添加这些内容,添加安全性的ASP元数据库设置仅在SSL证书在Web服务器上时才有效。在我们的例子中,SSL证书位于Web服务器前面的负载平衡器上。) / p>

Start2.asp的代码

<%
    'CODE for authorization/authentication
   '...

Session.Contents.RemoveAll
Session.Abandon
If instr(Request.ServerVariables("HTTP_COOKIE"), "ASPSESSIONID") > 0 Then
       Dim Allcookies

        AllCookies = Split(Request.ServerVariables("HTTP_COOKIE"),";")

        For i = 1 to UBound(AllCookies)

            if left(Request.ServerVariables("HTTP_HOST"),2) = "65" and instr(AllCookies(i), "ASPSESSIONID") > 0 Then
                Response.AddHeader "Set-Cookie", AllCookies(i) & "; path=/;secure;httponly"
            End if        

        Next 

End if

%>

<html>
<body>
<form action="login.asp" method="post">
<input type="hidden" name="start2" id="start2" value="Yes" />

</form>

<script type="text/javascript">
     document.forms[0].submit();
</script>
</body>
</html>

但实际上,直到Start2.asp中才会生成新的ASPSessionID,因此必须在login.asp中完成secure和httponly的Set-Cookie代码。因此,在此代码之后,上面相同的代码被复制到login.asp的顶部:

If request.form("Start2") = "" Then
    Response.Redirect("start.asp")
End if

答案 1 :(得分:1)

IMO - 您需要结束会话而不是仅清除会话ID。在这种情况下,Session.Abandon就是解决方案。参考:http://www.devguru.com/technologies/asp/quickref/session_abandon.html

HTH。

答案 2 :(得分:0)

这与ASP.NET有关,但描述了您在ASP中看到的行为

  

当您放弃会话时,不会删除会话ID Cookie   用户的浏览器。因此,会议一旦开始   放弃,对同一应用程序的任何新请求都将使用相同的   会话ID,但会有一个新的会话状态实例。

http://support.microsoft.com/?kbid=899918

只有在同一会话中使用相同的浏览器时才会出现此行为,只要浏览器关闭,会话cookie就会丢失(提供明确的到期日期尚未设置)。

您可以尝试调用Session.Abandon,然后将用户重定向到使用JavaScript清除所有Cookie,然后重定向到登录页面或您喜欢的任何页面的页面。

Clearing all cookies with JavaScript