3

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

更多说明:

第一次访问页面,我在 Response 的代理编辑器中看到了这个:

设置 Cookie:ASPSESSIONID=PUYQGHUMEAAJPUYL;路径=/Web 应用程序

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

4

3 回答 3

3

所以我确实想出了一个解决方案,如下所示。我添加了两个页面,分别称为 Start.asp 和 Start2.asp。原始登录页面已更改为检查现在在 Start2.asp 上设置的 post 变量,因此如果 login.asp 没有看到该 post 变量,它会重定向到 Start.asp。Start.asp 通过将 ASPSessionID 设置为 0 来使其无效。关键是使用 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(我不得不添加这些以获得另一个发现,仅当 SSL 证书位于 Web 服务器上时,ASP 元数据库设置才能添加安全。在我们的示例中,SSL 证书位于 Web 服务器前面的负载平衡器上)。

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>

但实际上,新的 ASPSessionID 直到在 Start2.asp 中才生成,因此用于安全和 httponly 的 Set-Cookie 代码也必须在 login.asp 中完成。所以上面相同的代码被复制到 login.asp 的顶部,就在这段代码之后:

If request.form("Start2") = "" Then
    Response.Redirect("start.asp")
End if
于 2012-05-25T14:32:31.873 回答
1

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

HTH。

于 2012-05-21T20:15:50.050 回答
0

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

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

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

只有在同一会话使用同一浏览器时才会发生此行为,一旦关闭浏览器,会话 cookie 就会丢失(前提是尚未设置明确的到期日期)。

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

使用 JavaScript 清除所有 cookie

于 2012-05-21T20:21:23.187 回答