Получить все куки из Internet Explorer
Я пытаюсь получить все файлы cookie, связанные с определенной страницей, которую я открыл (я уже прошел проверку подлинности). Есть несколько файлов cookie, связанных с веб-страницей, мне нужно получить каждый файл cookie, чтобы выполнить POST позже.
Я пробовал несколько подходов, но ни один не дал мне полный список. Я написал код до сих пор в VBA, но я в порядке и с.NET.
Первая попытка, после получения указателя на IE.
arraycookie = Split(ie.document.Cookie, ";")
For i = LBound(arraycookie) To UBound(arraycookie)
Debug.Print arraycookie(i)
Next i
Это дает мне некоторые печенья, но не все. Я могу просмотреть файлы cookie в инструментах разработчика (F12) и подтвердил, что в файлах cookie не отмечен только HTTP-флажок. Смотрите картинку ниже.
Я также попробовал WindowsGetCookie Windows API. Он возвращает cookie, но только один, и это один и тот же файл, независимо от того, как его имя (например, FedAuth ниже).
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
Это всего лишь предположение (любая идея, как я мог это выяснить?), Но из того, что я прочитал, может быть, что cookie-файл защищен. Я посмотрел на API IEGetProtectedModeCookie, но не смог получить информацию о cookie.
Не уверен, почему я могу увидеть это с помощью инструментов разработчика, но когда я пытаюсь раскрыть информацию, она не возвращает все.
Любая помощь будет принята с благодарностью:)
Спасибо!
редактировать
Поэтому, обойдя эту проблему, я решил попробовать эту же веб-страницу в другом браузере и снова просмотреть сведения о файлах cookie.
При использовании Firebug файлы cookie, которые я пытался получить, теперь показывают флаг HTTP Only. Насколько я понимаю, я могу использовать InternetGetCookieEx с указанным флагом INTERNET_COOKIE_HTTPONLY. Однако я не могу заставить его что-либо вернуть.
У кого-нибудь есть рабочий образец, которым я могу следовать?
1 ответ
Попробуйте получить IE куки из shell:cookies
папка. Ниже приведен код в качестве примера:
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
Вывод для меня после удаления всех файлов cookie и перехода на https://stackru.com/ выглядит следующим образом:
Некоторые замечания относительно кода.
Он разбирает файлы в Cookies\
только папка, но не в Cookies\Low\
который предназначен для приложений, работающих с низкими привилегиями. Он извлекает постоянные файлы cookie, хранящиеся только в папке, но не сеансовые файлы cookie, которые хранятся в памяти и могут быть доступны только процессу, который их создал. Время в UTC.
Структура файла cookie в файле выглядит следующим образом:
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 (*)
Флаги определены согласно wininet.dll
заголовки:
#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