InternetGetCookieEx:不工作

时间:2013-08-15 22:03:05

标签: wpf internet-explorer cookies ssl wininet

我正在尝试通过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总是等于259,后者又转换为ERROR_NO_MORE_ITEMS,意味着没有找到任何cookie。

1)相关网站位于受信任的网站区域,因此它不受保护模式的影响。

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

3)我拼命搜索我的硬盘上的这些饼干&#39;位置,无济于事。

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

5)Windows 8 x64,IE10,VS2012

这是一个项目里程碑的一小部分,给了我无数个小时的痛苦,所以任何帮助都将受到高度赞赏。

我非常愿意尽快改变我的方法,只要它能给我这个cookie的价值,除非它有点过分(即winpcap / fiddlercore等)

2 个答案:

答案 0 :(得分:4)

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

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

另请注意,您只会看到IE使用此代码的持久性Cookie;会话cookie是按进程隔离的,因此您的应用程序将不会从IE选项卡中看到会话cookie。

答案 1 :(得分:1)

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

一种可行的解决方案如下: 将站点加载到Web浏览器控件中。 我发布的代码按预期工作。