ASP会话Cookie移除及HTTPOnly配置问题求助
我太懂你这种头疼了——Classic ASP作为老古董,和现代ASP.NET的配置逻辑完全不搭,常规的web.config设置根本碰不到它的会话Cookie。下面给你几个亲测有效的解决思路:
一、直接在会话启动时修改Cookie属性(最靠谱)
Classic ASP的会话Cookie(就是那个ASPSESSIONID开头的玩意儿),默认不带HTTPOnly标记,而且<httpCookies>这种ASP.NET的配置节点对它完全无效。你可以在站点根目录的Global.asa文件里加一段VBScript代码,直接在会话刚创建的时候修改它的属性:
Sub Session_OnStart ' 先拿到当前会话Cookie的名字,格式是ASPSESSIONID加一串字符 Dim cookieName cookieName = "ASPSESSIONID" & Mid(Session.SessionID, 1, 8) ' 强制加上HTTPOnly,要是你用的是HTTPS站点,顺便把Secure也加上 Response.Cookies(cookieName).HTTPOnly = True Response.Cookies(cookieName).Secure = True ' 非HTTPS环境就把这行删掉 ' 要是想彻底移除会话Cookie,就把过期时间设成昨天 ' Response.Cookies(cookieName).Expires = DateAdd("d", -1, Now()) End Sub
这个方法直接从源头修改Cookie属性,Qualys扫描肯定能检测到HTTPOnly标记。
二、修正IIS URL重写的出站规则(之前的规则可能匹配错了)
你之前用出站规则没生效,大概率是匹配条件没对准Classic ASP的Cookie格式。它的Cookie是ASPSESSIONIDXXXXXX=一串随机值,得精确匹配这个格式的响应头才行。
把web.config里的出站规则改成下面这样:
<system.webServer> <rewrite> <outboundRules> <rule name="给Classic ASP会话Cookie加HTTPOnly" preCondition="响应里有ASP会话Cookie"> <match serverVariable="RESPONSE_Set_Cookie" pattern="^(ASPSESSIONID\w+=[^;]+)" /> <action type="Rewrite" value="{R:1}; HttpOnly; Secure" /> </rule> <preConditions> <preCondition name="响应里有ASP会话Cookie"> <add input="{RESPONSE_Set_Cookie}" pattern="ASPSESSIONID" /> </preCondition> </preConditions> </outboundRules> </rewrite> </system.webServer>
注意事项:
- 得确保你的IIS已经装了URL重写模块2.0及以上版本,不然规则根本跑不起来
- 要是站点还在用HTTP(不是HTTPS),把规则里的
; Secure删掉 - 这个规则会自动匹配所有
ASPSESSIONID开头的Cookie,给它们加上HttpOnly和Secure属性
三、怎么验证配置生效了?
改完之后别光等Qualys扫描,自己先验证下:
- 打开浏览器F12开发者工具,切换到「网络」标签
- 访问你的ASP站点,看响应头里的
Set-Cookie字段,应该能看到HttpOnly(和Secure如果设置了) - 或者用curl命令测试:
curl -I https://你的ASP站点地址
看输出里的Set-Cookie行,应该是类似ASPSESSIONIDABCDEF=XXXXXX; HttpOnly; Secure这样的
四、彻底干掉会话Cookie的办法
要是你根本不需要会话功能,直接禁用就行:
- 在Global.asa里加这段,整个站点都禁用会话:
Sub Application_OnStart Session.Abandon() End Sub
- 或者在单个页面顶部加这行,只禁用当前页面的会话:
<%@ EnableSessionState=False %>
这样ASP就不会生成会话Cookie了。
内容的提问来源于stack exchange,提问作者Coded Container
相关产品推荐
相关产品推荐

