2016-08-02 2 views
11

Я пытаюсь получить все файлы cookie, связанные с определенной страницей, которую я открыл (я уже прошел проверку подлинности). Есть несколько файлов cookie, связанных с веб-страницей, мне нужно получить каждый куки-файл, чтобы позже выполнить POST.Извлечь ВСЕ файлы cookie из Internet Explorer

Я пробовал несколько подходов, но ни один из них не дал мне полный список. Я написал код до сих пор в VBA, но я в порядке с ним и в .NET.

Первая попытка, после получения указателя на IE.

arraycookie = Split(ie.document.Cookie, ";") 

For i = LBound(arraycookie) To UBound(arraycookie) 
    Debug.Print arraycookie(i) 
Next i 

Это дает мне некоторые файлы cookie, но не все из них. Я могу просмотреть файлы cookie в инструментах разработчика (F12), и я подтвердил, что ни один из файлов cookie не имеет отмеченного только HTTP-флага. См. Рисунок ниже.

No HTTP Only Flag

Я также попытался 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) 
    If bRet = False Then 
     MsgBox "Failed" 
    Else 
     MsgBox sCookieVal 
    End If 
End Sub 

Это только предположение (любая идея, как я могу узнать?), Но от того, что я прочитал это может быть, что куки защищены. Я взглянул на IEGetProtectedModeCookie API, но я не мог заставить его возвращать информацию о файлах cookie.

Не уверен, почему я вижу это через инструменты разработчика, но когда я пытаюсь разоблачить информацию, он не возвращает все.

Любая помощь будет принята с благодарностью :)

Спасибо!


Редактировать

Таким образом, после рытья вокруг этого вопроса, я думал, что я хотел бы попробовать тот же веб-страницу с помощью другого браузера и снова рассмотреть детали печенья.

Использование Firebug для файлов cookie, которые я пытался извлечь, теперь показывает флаг HTTPOnly. Насколько я понимаю, я могу использовать InternetGetCookieEx с указанным флажком INTERNET_COOKIE_HTTPONLY. Однако я не могу заставить его что-либо вернуть.

У кого-нибудь есть рабочий образец, за которым я могу следовать?

+0

попробуйте эту ссылку: http://visualbasic.happycodings.com/ files-directories-drives/code46.html, он перечисляет все файлы cookie для всех сайтов. – cyboashu

+0

Можете ли вы отличить файлы cookie, которые показаны от тех, которые не являются? –

+0

@Tom Отличить как? Вы хотите увидеть список? Я могу сказать, какие из них отсутствуют, если это вопрос. –

ответ

1

Попробуйте восстановить файлы cookie 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 

Выход для меня после удаления куки и навигации по https://stackoverflow.com/ выглядит следующим образом:

output

Некоторые замечания относительно кода.

Он анализирует файлы только в папке Cookies\, но не в Cookies\Low\, которая предназначена для приложений, работающих под низкими привилегиями. Он извлекает постоянные файлы cookie, хранящиеся только в папке, но не файлы cookie сеансов, которые хранятся в памяти и могут быть доступны только процессом, который их создал. Время в UTC.

Структура куки в файле выглядит следующим образом:

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 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 
+0

Спасибо! Это сделало это –

+0

Получает ли он файлы cookie только из IE, IE Edge или Safari, Google Chrome, Chromium, Firefox, Opera? – YumYumYum

+1

@YumYumYum Это только для IE. – omegastripes

Смежные вопросы