internet-explorer - 我可以在 ActiveX 中使用 IHTMLDocument2 访问 HttpOnly cookie 吗?

标签 internet-explorer cookies activex session-cookies httponly

我可以通过 Internet Explorer 11 中运行的 ActiveX 中的 IHTMLDocument2::cookie 访问标记为 HttpOnly 的 session cookie 吗?这是来自 the answer to this question 的代码示例:

CComPtr<IHTMLDocument2> pDoc // get document from event as shown in the sample.

// read the cookie
CComBSTR cookie;
hr = pDoc->get_cookie(&cookie);

如果这无法通过 IHTMLDocument2 实现,是否还有其他方法可以访问在 ActiveX 中在 IE 中打开的网站的所有 cookie?

最佳答案

无法使用文档对象读取 cookie。因此,您需要在浏览器上下文之外读取 cookie。有一个 SO 线程解释了如何做同样的事情

Retrieve ALL cookies from Internet Explorer

以下是答案中供引用的VBA代码

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

当然,如果你想在那里使用它,你需要将它移植到 VC++ 代码中

关于internet-explorer - 我可以在 ActiveX 中使用 IHTMLDocument2 访问 HttpOnly cookie 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50267610/

相关文章:

scripting - 如何禁用 "ActiveX Control May Be Unsafe"弹出窗口

javascript - 检测 IE10+ 加载状态

android - 如何在 android 中使用 HttpUrlConnection 类将 cookie 添加到 url?

delphi - 从序列化数据创建数字人物指纹模板

.net - VB.NET DLL "ActiveX component can' t 创建对象”

javascript - 使用 AJAX 请求发送 POST、GET 和 COOKIE 数据

javascript - 为什么这些日历 javascript 隐藏 IE 的 select、applet 和 iframe 标记?

JQuery UI 菜单 float 右侧图标导致 Internet Explorer 中出现新行

javascript - 跨站点 XmlHttp (XDomainRequest)

php - 使用Cookie或其他方式恢复控制PH​​P变量的下拉列表框的状态