所以我确实想出了一个解决方案,如下所示。我添加了两个页面,分别称为 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