我正在尝试通过 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等)