2

我正在尝试通过 WPF、VB.NET 应用程序读取 HttpOnly cookie。有问题的网站在访问时提供 2 个 cookie:一个 HttpOnly,一个常规。

我访问了我想通过 Internet Explorer 读取其 cookie 的站点。然后开发者工具-->缓存-->查看cookie信息。那里只显示常规 cookie,而不是 HttpOnly (Chrome 正确显示它们。如果我删除它并刷新,站点返回 500 错误,因此 cookie 肯定存在)。

我根据这里的解释运行我的代码:c# Get httponly cookie,如下所示:

Private Const INTERNET_COOKIE_HTTPONLY As Integer = &H2000

<SuppressUnmanagedCodeSecurity, SecurityCritical, DllImport("wininet.dll", EntryPoint:="InternetGetCookieExW", SetLastError:=True, CharSet:=CharSet.Unicode, ExactSpelling:=True)>
Friend Shared Function InternetGetCookieEx(<[In]> Url As String, <[In]> cookieName As String, <Out> cookieData As StringBuilder, <[In], Out> ByRef pchCookieData As UInteger, flags As UInteger, reserved As IntPtr) As Boolean
End Function


<SecurityCritical()>
Public Shared Function GetCookie(url As String) As String
    Dim size As Integer = 0
    Dim sb As New StringBuilder
    If InternetGetCookieEx(url, vbNullString, Nothing, size, INTERNET_COOKIE_HTTPONLY, IntPtr.Zero) Then '<-- this always returns false
        If size <= 0 Then
            Return Nothing
        End If
        sb = New StringBuilder(size + 1)
        If Not InternetGetCookieEx(url, vbNullString, sb, size, INTERNET_COOKIE_HTTPONLY, IntPtr.Zero) Then
            Return Nothing
        End If
    End If
    Dim lastErrorCode = Marshal.GetLastWin32Error '<-- 259
    Return sb.ToString()
End Function

GetCookie("https://www.xyz.com")

我已经尝试了上面的许多变体,结果是一样的:lastErrorCode ALWAYS 等于 259,这反过来又转换为 ERROR_NO_MORE_ITEMS,这意味着没有找到任何 cookie。

1)有问题的站点在受信任的站点区域中,因此它在保护模式下不起作用。

2) 该网站在 SSL 下(我不知道这是否与任何事情有关)。

3) 我拼命地在我的硬盘上搜索这些 cookie 的位置,但无济于事。

4)两者都是会话cookie(即没有声明的到期日期)

5) Windows 8 x64, IE10, VS2012

这是一个项目里程碑的一小部分,它给了我无数小时的痛苦,所以任何帮助都将不胜感激。

一旦它给我这个cookie的价值,我非常愿意完全改变我的方法,除非它是矫枉过正的(即winpcap / fiddlercore等)

4

2 回答 2

4

您正确地注意到您的代码只能在受信任区域中工作,因为这里是 Q10:http: //blogs.msdn.com/b/ieinternals/archive/2009/08/20/wininet-ie-cookie -internals-faq.aspx,因为 IE(以保护模式或 AppContainer 运行)和您的应用程序(以中等 IL 运行)之间不共享 cookie。

您应该将一个有效的 URL 传递给函数(例如,您需要在主机名后至少有一个斜杠);即使无效的 URL 在今天有效,将来也可能无效。

另外请记住,您只会看到带有此代码的 IE 的持久 cookie;会话 cookie 是按进程隔离的,因此您的应用程序不会从 IE 选项卡中看到会话 cookie。

于 2013-08-15T22:14:55.830 回答
1

对于所有可能关心的人:Eric 是绝对正确的:会话 cookie 是在进程中,因此它们对外界几乎是不可见的。

一种可行的解决方案如下: 在 webbrowser 控件中加载站点。我发布的代码按预期工作。

于 2013-08-16T08:18:34.943 回答