从Internet Explorer检索所有cookie [英] Retrieve ALL cookies from Internet Explorer
问题描述
我正在尝试检索与我已打开(已经通过身份验证)的特定页面相关的所有cookie。网页上有多个Cookie,我需要检索每个Cookie以便稍后进行POST。
我尝试了几种方法,但都没有给出我完整的清单。到目前为止,我已经用VBA编写了代码,但也可以在.NET中使用它。
在获得指向IE的指针后的首次尝试。
arraycookie = Split(ie.document.Cookie,;)
对于i = LBound (arraycookie)到UBound(arraycookie)
Debug.Print arraycookie(i)
接下来的i
这给了我一些cookie,但不是全部。我可以在开发人员工具(F12)中查看cookie,并确认没有cookie标记有HTTP only标志。参见下面的图片。
我还尝试了InternetGetCookie Windows API。它返回的是cookie,但只有一个,无论名称如何(例如下面的FedAuth),它都是相同的。
Private Sub GetCookieAttempt()
Dim sCookieVal as String * 256
Dim bRet As Boolean
bRet = InternetGetCookie( https://mywebsiteaddresshere.com,_
FedAuth, sCookieVal,255)
如果bRet = False,则
MsgBox失败
其他
MsgBox sCookieVal
End如果
End Sub
这只是一个猜测(不知道我怎么知道吗?),但是从我读到的内容来看,可能是cookie受保护。我看了一下IEGetProtectedModeCookie API,但无法获取它返回Cookie信息。
不确定为什么我可以通过开发人员工具看到此信息,但是当我尝试公开信息时,它不会返回所有信息。
任何帮助将不胜感激:)
谢谢!
编辑
因此,在研究了这个问题之后,我想我会尝试使用不同的浏览器浏览同一网页并再次查看Cookie的详细信息。
使用Firebug,我尝试检索的cookie现在显示HTTPOnly标志。据我了解,我可以将InternetGetCookieEx与指定的INTERNET_COOKIE_HTTPONLY标志一起使用。但是我不能让它返回任何东西。
有人可以跟踪我的工作样本吗?
尝试从 shell:cookies
文件夹中检索IE cookie。以下是示例代码:
Option Explicit
Sub GetIECookies()
Dim sCookiesPath作为字符串
Dim oCookies作为对象
Dim oFSO作为对象
Dim oFolder作为对象
Dim oFile
Dim sContent作为字符串
Dim a()作为字符串
Dim i As Long
Dim aItems
Dim aCookies()
'读取IE cookie文件
sCookiesPath = CreateObject( shell.application)。Namespace( shell:Cookies)。self.Path
Set oCookies = CreateObject( Scripting.Dictionary)
Set oFSO = CreateObject( Scripting.FileSystemObject)
设置oFolder = oFSO.GetFolder(sCookiesPath)
对于oFolder.Files
中的每个oFile如果LCase(oFSO.GetExtensionName(oFile.Name))= txt然后
与oFile.OpenAsTextStream(1,0)'只读,ascii
sContent = .ReadAll
.Close
以
结束sContent = Replace(sContent,vbCr,)
’拆分文件
中的cookie a = Split(sContent,vbLf& *& vbLf)
对于i = 0到UBound(a)-1
oCookies.Add oCookies.Count,a(i)
下一个
如果
下一个
'解析数据,重新打包到2d数组
aItems = oCookies.Items()
如果UBound(aItems)= -1然后
MsgBox未找到cookie
其他
ReDim aCookies(1到UBound(aItems)+ 1,1到6)
For i = 1到UBound(aItems)+ 1
a = Split(aItems(i-1),vbLf)
aCookies(i,1)= a(0)
aCookies(i,2)= a(1)
aCookies(i,3)= a(2)
aCookies (i,4)= GetInetCookieFlags(a(3))
aCookies(i,5)= ConvDT(a(4),a(5))
aCookies(i,6)= ConvDT(a (6),a(7))
接下来的
'使用ThisWorkbook.Sheets(1)
.Cells.Delete
.Range( A1:F1 )= Array( Name, Value, Host / Path, Flags, Expiration, Created)
Ou tput .Range( A2),aCookies
以
结尾如果
End Sub
Function ConvDT(sLowNTFmt as String,sHighNTFmt As String )作为日期
Dim dNTFmt作为Double
Dim dUnixFmt As Double
'FILETIME格式是自1601年1月1日00:00以来的100纳秒刻度数(世界标准时间)。
dNTFmt = sHighNTFmt * 4294967296#+ sLowNTFmt
'Unix时间格式是自1970年1月1日00:00以来的秒数
dUnixFmt = 0.0000001 * dNTFmt-11644473600#
'VB时间格式是自1900年1月1日00:00以来的天数
ConvDT = CDate(dUnixFmt / 86400 + 25569)
结束函数
函数GetInetCookieFlags(sFlags As String)As String
Dim lFlags As long
Dim aFlag
'重置位32以避免溢出
如果sFlags> = 2147483648#然后lFlags = CLng(sFlags-2147483648#)其他lFlags = CLng(sFlags)
'将标志位转换为字符串表示形式
使用CreateObject( Scripting.Dictionary)
对于数组中的每个aFlag( _
Array(& H10,第三方)_
Array(& H1, IS SECURE),_
Array(& H2, IS SESSION),_
Array(& H10,第三方) ,_
Array(& H20,需要PROMPT),_
Array(& H40, EVALUATE P3P) ,_
Array(& H80,已限制),_
Array(& H100, P3P ENABLED),_
Array(& H200,已限制 ),_
Array(& H400, IE6),_
Array(& H800, IS LEGACY),_
Array(& H1000, NON SCRIPT ),_
Array(& H2000, HTTPONLY),_
Array(& H4000,仅主机),_
Array(& H8000,仅适用于主机),_
Array(& H20000, RESTRICTED ZONE),_
Array(& H20000000, ALL COOKIES),_
Array(& H40000000, NO回调),_
Array(& H80000000, ECTX 3RDPARTY)_
)
如果lFlags和aFlag(0)然后.Add .Count,aFlag(1)
下一个
GetInetCookieFlags = Join(.Items(),vbCrLf)
以
结尾
结束函数
子输出(oDstRng如范围,aCells如变体)
和oDstRng
。选择
与.Resize(_
UBound(aCells,1)-LBound(aCells,1)+ 1,_
UBound(aCells,2)-LBound(aCells,2)+ 1 _
)
.NumberFormat = @
.Value = aCells
.Columns.AutoFit
结尾为
结尾为
End Sub
删除所有cookie并导航到
有关代码的一些说明。
它解析 Cookies\中的文件仅code>文件夹,但不在
Cookies\Low\
文件夹中,该文件夹用于在低特权下运行的应用程序。它仅检索存储在文件夹中的持久性cookie,而不检索会话cookie,后者存储在内存中,并且只能由创建它们的进程访问。时间以UTC为单位。
文件中cookie的结构如下:
Cookie名称
Cookie值
设置cookie的Web服务器的主机/路径
标志
激发时间(低)
到期时间(高)
创建时间(低)
创建时间(高)
记录定界符(*)
根据 wininet.dll
标头:
#define INTERNET_COOKIE_IS_SECURE 0x00000001
#define INTERNET_COOKIE_IS_SESSION 0x00000002
#define INTERNET_COOKIE_THIRD_PARTY 0x00000010
#define INTERNET_OK_PIE 0x00000040
的#define INTERNET_COOKIE_APPLY_P3P 0x00000080
的#define INTERNET_COOKIE_P3P_ENABLED 0x00000100
的#define INTERNET_COOKIE_IS_RESTRICTED 0x00000200
的#define INTERNET_COOKIE_IE6 0x00000400时
的#define INTERNET_COOKIE_IS_LEGACY 0x00000800
的#define INTERNET_COOKIE_NON_SCRIPT 0x00001000
的#define INTERNET_COOKIE_HTTPONLY 0x00002000
的#define INTERNET_COOKIE_HOST_ONLY 0x00004000
的#define INTERNET_COOKIE_APPLY_HOST_ONLY 0x00008000
的#define INTERNET_COOKIE_RESTRICTED_ZONE 0x00020000
的#define INTERNET_COOKIE_ALL_COOKIES 0x20000000
的#define INTERNET_COOKIE_NO_CALLBACK 0x40000000之后
#定义INTERNET_COOKIE_ECTX_3RDPARTY 0x80000000
I'm trying to retrieve all cookies that are associated with a specific page I have open (I've already authenticated). There are several cookies associated with the webpage, I need to retrieve each cookie in order to do a POST later on.
I've tried several approaches, but none have given me the full list. I've written the code thus far in VBA, but I'm fine with it being in .NET as well.
First attempt, after getting the pointer to IE.
arraycookie = Split(ie.document.Cookie, ";")
For i = LBound(arraycookie) To UBound(arraycookie)
Debug.Print arraycookie(i)
Next i
This gives me some of the cookies, but not all of them. I can review the cookies in the developer tools (F12) and I confirmed no cookies have the HTTP only Flag marked. See the picture below.
I also tried the InternetGetCookie windows API. It's returning a cookie, but only one, and it's the same one no matter what the name is (e.g. FedAuth below).
Private Sub GetCookieAttempt()
Dim sCookieVal As String * 256
Dim bRet As Boolean
bRet = InternetGetCookie("https://mywebsiteaddresshere.com", _
"FedAuth", sCookieVal, 255)
If bRet = False Then
MsgBox "Failed"
Else
MsgBox sCookieVal
End If
End Sub
This is just a guess (any idea how I could find out?), but from what I read it may be that the cookie is protected. I took a look at the IEGetProtectedModeCookie API, but I couldn't get it to return cookie information.
Not sure why I can see this through developer tools, but when I try and expose the information, it doesn't return everything.
Any help would be greatly appreciated :)
Thanks!
Edit
So after digging around this issue I thought I'd try the same webpage with a different browser and review the cookie details again.
Using Firebug the cookies I was trying to retrieve is now showing an HTTPOnly flag. From what I understand I can use InternetGetCookieEx with the INTERNET_COOKIE_HTTPONLY flag specified. However I can't get it to return anything.
Does anyone have a working sample I can follow?
Try to retrieve IE cookies from shell:cookies
folder. There is the below code as an example:
Option Explicit
Sub GetIECookies()
Dim sCookiesPath As String
Dim oCookies As Object
Dim oFSO As Object
Dim oFolder As Object
Dim oFile
Dim sContent As String
Dim a() As String
Dim i As Long
Dim aItems
Dim aCookies()
' read IE cookie files
sCookiesPath = CreateObject("shell.application").Namespace("shell:Cookies").self.Path
Set oCookies = CreateObject("Scripting.Dictionary")
Set oFSO = CreateObject("Scripting.FileSystemObject")
Set oFolder = oFSO.GetFolder(sCookiesPath)
For Each oFile In oFolder.Files
If LCase(oFSO.GetExtensionName(oFile.Name)) = "txt" Then
With oFile.OpenAsTextStream(1, 0) ' read-only, ascii
sContent = .ReadAll
.Close
End With
sContent = Replace(sContent, vbCr, "")
' split cookies within file
a = Split(sContent, vbLf & "*" & vbLf)
For i = 0 To UBound(a) - 1
oCookies.Add oCookies.Count, a(i)
Next
End If
Next
' parse data, repack to 2d array
aItems = oCookies.Items()
If UBound(aItems) = -1 Then
MsgBox "No cookies found"
Else
ReDim aCookies(1 To UBound(aItems) + 1, 1 To 6)
For i = 1 To UBound(aItems) + 1
a = Split(aItems(i - 1), vbLf)
aCookies(i, 1) = a(0)
aCookies(i, 2) = a(1)
aCookies(i, 3) = a(2)
aCookies(i, 4) = GetInetCookieFlags(a(3))
aCookies(i, 5) = ConvDT(a(4), a(5))
aCookies(i, 6) = ConvDT(a(6), a(7))
Next
' output
With ThisWorkbook.Sheets(1)
.Cells.Delete
.Range("A1:F1") = Array("Name", "Value", "Host/Path", "Flags", "Expiration", "Created")
Output .Range("A2"), aCookies
End With
End If
End Sub
Function ConvDT(sLowNTFmt As String, sHighNTFmt As String) As Date
Dim dNTFmt As Double
Dim dUnixFmt As Double
' FILETIME format is the number of 100 nanosecond ticks since 00:00 1 Jan, 1601 (UTC).
dNTFmt = sHighNTFmt * 4294967296# + sLowNTFmt
' Unix time format is the number of seconds since 00:00 1 Jan 1970
dUnixFmt = 0.0000001 * dNTFmt - 11644473600#
' VB time format is the number of days since 00:00 1 Jan 1900
ConvDT = CDate(dUnixFmt / 86400 + 25569)
End Function
Function GetInetCookieFlags(sFlags As String) As String
Dim lFlags As Long
Dim aFlag
' reset bit 32 to avoid overflow
If sFlags >= 2147483648# Then lFlags = CLng(sFlags - 2147483648#) Else lFlags = CLng(sFlags)
' convert flags bits to string representation
With CreateObject("Scripting.Dictionary")
For Each aFlag In Array( _
Array(&H1, "IS SECURE"), _
Array(&H2, "IS SESSION"), _
Array(&H10, "THIRD PARTY"), _
Array(&H20, "PROMPT REQUIRED"), _
Array(&H40, "EVALUATE P3P"), _
Array(&H80, "APPLY P3P"), _
Array(&H100, "P3P ENABLED"), _
Array(&H200, "IS RESTRICTED"), _
Array(&H400, "IE6"), _
Array(&H800, "IS LEGACY"), _
Array(&H1000, "NON SCRIPT"), _
Array(&H2000, "HTTPONLY"), _
Array(&H4000, "HOST ONLY"), _
Array(&H8000, "APPLY HOST ONLY"), _
Array(&H20000, "RESTRICTED ZONE"), _
Array(&H20000000, "ALL COOKIES"), _
Array(&H40000000, "NO CALLBACK"), _
Array(&H80000000, "ECTX 3RDPARTY") _
)
If lFlags And aFlag(0) Then .Add .Count, aFlag(1)
Next
GetInetCookieFlags = Join(.Items(), vbCrLf)
End With
End Function
Sub Output(oDstRng As Range, aCells As Variant)
With oDstRng
.Parent.Select
With .Resize( _
UBound(aCells, 1) - LBound(aCells, 1) + 1, _
UBound(aCells, 2) - LBound(aCells, 2) + 1 _
)
.NumberFormat = "@"
.Value = aCells
.Columns.AutoFit
End With
End With
End Sub
The output for me after deleting all cookies and navigating to https://stackoverflow.com/ is as follows:
Some notes regarding the code.
It parses files in Cookies\
folder only, but not in Cookies\Low\
which is for applications running under low privileges. It retrieves persistent cookies stored in the folder only, but not session cookies, which are stored in memory and can be accessed only by the process that created them. Time is in UTC.
The structure of a cookie within a file is as follows:
Cookie name
Cookie value
Host/path for the web server setting the cookie
Flags
Exirpation time (low)
Expiration time (high)
Creation time (low)
Creation time (high)
Record delimiter (*)
Flags are defined as per wininet.dll
headers:
#define INTERNET_COOKIE_IS_SECURE 0x00000001
#define INTERNET_COOKIE_IS_SESSION 0x00000002
#define INTERNET_COOKIE_THIRD_PARTY 0x00000010
#define INTERNET_COOKIE_PROMPT_REQUIRED 0x00000020
#define INTERNET_COOKIE_EVALUATE_P3P 0x00000040
#define INTERNET_COOKIE_APPLY_P3P 0x00000080
#define INTERNET_COOKIE_P3P_ENABLED 0x00000100
#define INTERNET_COOKIE_IS_RESTRICTED 0x00000200
#define INTERNET_COOKIE_IE6 0x00000400
#define INTERNET_COOKIE_IS_LEGACY 0x00000800
#define INTERNET_COOKIE_NON_SCRIPT 0x00001000
#define INTERNET_COOKIE_HTTPONLY 0x00002000
#define INTERNET_COOKIE_HOST_ONLY 0x00004000
#define INTERNET_COOKIE_APPLY_HOST_ONLY 0x00008000
#define INTERNET_COOKIE_RESTRICTED_ZONE 0x00020000
#define INTERNET_COOKIE_ALL_COOKIES 0x20000000
#define INTERNET_COOKIE_NO_CALLBACK 0x40000000
#define INTERNET_COOKIE_ECTX_3RDPARTY 0x80000000
这篇关于从Internet Explorer检索所有cookie的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!