Internet-Explorer – Can I use IHTMLDocument2 in ActiveX to access HTTPONLY cookies?

Can I access session cookies marked HttpOnly through I HTMLDocument2::cookie in ActiveX running in Internet Explorer 11? Here is a code sample from the answer to this question:

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

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

If this is not possible through IHTMLDocument2 is there any other way to Visit all cookies of the website opened in IE inside ActiveX?

The cookie cannot be read using the document object. Therefore, you need to read it outside the context of the browser Take cookies. There is an SO thread explaining how to do the same thing

Retrieve ALL cookies from Internet Explorer

The following is the VBA code for the answer reference

< p>

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< br /> 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( _< br /> 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(&H800 0, "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< br /> End With
End With

End Sub

Of course, if you want to use it in VC code, you need to port it to VC code

p>

I can use I HTMLDocument2::coo in ActiveX running in Internet Explorer 11 Does kie access session cookies marked as HttpOnly? Here is a code sample from the answer to this question:

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

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

If this is not possible through IHTMLDocument2 is there any other way to Visit all cookies of the website opened in IE inside ActiveX?

The cookie cannot be read using the document object. Therefore, you need to read the cookie outside the context of the browser. There is an SO thread explaining how to do the same

Retrieve ALL cookies from Internet Explorer

The following is the VBA code for answer reference

Option Explicit< br />
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< br /> 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

Of course, if you want to use it in VC code, you need to port it to VC code

Leave a Comment

Your email address will not be published.