【问题标题】:Adding Same-site; Secure to Cookies in Classic ASP添加同一站点;在经典 ASP 中保护 Cookie
【发布时间】:2024-01-04 18:52:01
【问题描述】:

我们正在运行一个经典的 ASP 网站,但在 Chrome 浏览器中存在 Cookie 问题。 Chrome 正在强制安全地设置 cookie (https://www.chromestatus.com/feature/5633521622188032)

我们设置一个cookie如下:

Response.AddHeader "Set-Cookie", "TestCookie=This is a Test; path=/; SameSite=None; Secure" 
Response.Cookies("TestCookie").Expires = Date + 1

但是,这在 Chrome 中存在问题,当调用不同域的资源时会话会突然结束。

Chrome 的 cookie 详细信息显示如下:

Send for
Same-site connections only

请注意,我认为应该没有提及“安全”。 为此在经典 ASP 中设置 Cookie 的正确方法是什么?

【问题讨论】:

  • 删除指向此答案的链接 - *.com/a/63446744/4570。 URL 重写方法可能是最简单的方法,无需修改很多经典的 ASP 代码。

标签: cookies vbscript asp-classic


【解决方案1】:

您当前设置响应 Cookie 的方法存在问题。

在使用Set-Cookie 设置标头之后使用Response.Cookies,您实际上是在创建一个名为“TestCookie”的新空cookie。相反,您希望将到期时间合并到现有的 Set-Cookie 标头中。

测试你的代码,这是响应头内容:

<%
Function FormatCookieDateTime(interval, value, tz)
  Dim dt: dt = DateAdd(interval, value, Date())
  Dim tm: tm = Time()
  Dim result: result = WeekDayName(WeekDay(dt), True) & ", " & _
    Right("00" & Day(dt), 2) & "-" & _
    MonthName(Month(dt), True) & "-" & _
    Year(dt) & " " & _
    Right("00" & Hour(Time()), 2) & ":" & _
    Right("00" & Minute(Time()), 2) & ":" & _
    Right("00" & Second(Time()), 2) & " " & tz
  
  FormatCookieDateTime = result
End Function

Response.AddHeader "Set-Cookie", "TestCookie=This is a Test; path=/; SameSite=None; Secure; expires=" & FormatCookieDateTime("d", 1, "GMT")
%>

构建了一个函数,可以更轻松地使用正确的格式设置到期时间。

记住Secure 用于安全连接

因为您正在设置两个 cookie(一个通过 AddHeader(),一个通过 Response.Cookie 可能不清楚,但如果连接未使用 HTTPS。事实上,如果您在 Chrome 开发工具中查看请求,您应该会在 Set-Cookie 标头旁边看到一个警告符号,上面写着 (当悬停在上面时) 类似的内容;

此 set-cookie 具有“安全”属性,但未通过安全连接接收。

【讨论】:

  • 第二行使用 DateAdd 时,参数似乎被交换了,应该是 DateAdd(interval, value, Date()) 吗?
【解决方案2】:

标准的 Response.Cookies 方法不能可靠地处理通过使用更低级别的 Reponse.Addheader 设置的 cookie。我也经历过。

我无法测试,但您可能想尝试两件事:

  1. 不要在同一个 ASP 代码块中使用这两条指令。我的猜测是使用AddHeader() 设置cookie 将绕过经典ASP 的cookie 集合。所以 Classic ASP 不会知道这个 cookie 已经被设置。您可以尝试在一个页面上设置此 cookie,将其发送到浏览器,然后在另一个页面上设置过期时间。

  2. 尝试使用相同的AddHeader() 指令设置过期时间。您将不得不在标题级别查看这是如何完成的,但它肯定是可能的。

我有一些在线示例代码使用Response.AddHeader() 设置了一个安全和HTTPOnly cookie,但它没有设置过期,这导致cookie 在浏览器(选项卡)关闭时过期:

https://gitlab.com/erik4/classic-asp-book-examples/-/blob/master/global.asa

【讨论】:

  • 你有没有miss this answer
  • 对不起@Lankymart;重新阅读您的答案,我意识到您解释了相同的情况,但措辞不同。我浏览了你的答案,但没有看到你在谈论同样的问题。
  • 我不是作家,所以不会那么雄辩。
最近更新 更多