存在没有名称的 cookie 时访问 cookie 时出错

Error when accessing cookies when a cookies without a name exists

在过去几天我管理的一些经典 ASP 网站上,我收到了一些错误通知(没有错误编号),这些通知总是在行号上显示错误,其中 cookie 值正在请求中。

查看每个错误的请求,它们都有不寻常的 cookie,看起来像是某种黑客尝试。

指出导致错误的行都是这样的:

strCookieCart = Request.Cookies("cart")

这是正在发送(截断)的 cookie 的几个示例...请注意 =true(没有名称,只有一个值)。

HTTP_COOKIE:=true; yuv=u97Yoe-o0UWp7ho_vaB2csT-xxaQ37gMWzhB1MARTSNk1QKpjJTXmZYMRQ095rM96MaNbhx1tEdJ

HTTP_COOKIE:pll_language=en; =true; yandexuid=6536735381437958890; st=6c9838994ffb

Classic ASP 无法处理这些吗?有什么方法可以避免这些错误并忽略错误的值吗?这些是否总是可能是黑客尝试,或者是否存在没有 cookie 名称的合法请求?

我想我可以通过手动解析或使用某种正则表达式检查来检查 Request.ServerVariables("HTTP_COOKIE") 中的这些内容。还有其他人这样做吗?有什么代码可以分享吗?

我对我自己的问题的建议答案是创建一个 class 在初始化时提取 cookie 的所有有效键和值,并具有 return 指定值的功能关键。

不幸的是,它不适用于包含多个值集合的 cookie,但我通常不使用它们。

这里是 class:

<%
Class MyRequest
    Private m_objCookies

    Private Sub Class_Initialize()
        Dim strCookies, i, strChar, strName, strValue, blnInValue
        strCookies = Request.ServerVariables("HTTP_COOKIE")
        Set m_objCookies = Server.CreateObject("Scripting.Dictionary")
        i = 1
        strName = ""
        strValue = ""
        blnInValue = False
        Do
            strChar = Mid(strCookies, i, 1)
            If strChar = ";" Or i = Len(strCookies) Then
                strValue = Trim(strValue)
                If strName <> "" And strValue <> "" Then
                    If m_objCookies.Exists(strName) Then
                        m_objCookies.Item(strName) = strValue
                    Else
                        m_objCookies.Add strName, strValue
                    End If
                End If
                If i = Len(strCookies) Then Exit Do 
                strName = ""
                strValue = ""
                blnInValue = False
            ElseIf strChar = "=" Then
                strName = Trim(strName)
                blnInValue = True
            ElseIf blnInValue Then
                strValue = strValue & strChar
            Else
                strName = strName & strChar
            End If
            i = i + 1
        Loop
    End Sub

    Public Function Cookies(strKey)
        Cookies = m_objCookies.Item(strKey)
    End Function
End Class
%>

使用此 class 对我的代码所做的更改很少。我目前在哪里...

strCookieCart = Request.Cookies("cart")

我需要更改为...

Dim objMyRequest : Set objMyRequest = New MyRequest
strCookieCart = objMyRequest.Cookies("cart")

我已经用我记录的许多错误请求测试了上面的内容并且它工作正常。

我自己的问题的第二个答案和我现在实施的解决方案是将以下代码添加到我的公共包含文件中。

它测试 Classic ASP 是否可以读取 cookie,并使用错误捕获,如果检测到错误则结束响应。

On Error Resume Next
Request.Cookies("test")
If Err.Number <> 0 Then Response.End
On Error Goto 0

这是对我的其他答案的更好解决方案,因为没有必要为显然是某种攻击的页面生成页面,因此尽快结束脚本是更好的选择。

为@johna is answer 添加三行代码,在此行之后:

If strChar = ";" Or i = Len(strCookies) Then

添加这些行:

            If i = Len(strCookies) And strChar <> ";" Then
                strValue = strValue & strChar
            End If