3 votes

La date d'expiration du cookie Asp classique n'est pas toujours fixée.

J'essaie de définir un cookie avec la méthode addheader -method dans Classic Asp, qui est le seul moyen d'ajouter, entre autres, les balises HttpOnly et Secure aux cookies. Tout fonctionne avec le code ci-dessous - mais il y a une exception et c'est la date/heure d'expiration.

<%
Response.AddHeader "Set-Cookie", "testCookie=2000; path=/;HttpOnly;Secure;expires=" & dateAdd("d", 365, Now()) & ";samesite=Strict;HostOnly"
%>

Cependant, il semble que ce soit un problème lié au navigateur. Dans firefox, je peux voir dans l'onglet Stockage des outils de développement que le délai d'expiration est défini. Mais dans Chrome, il reste toujours le délai par défaut qui est l'expiration à la fin de la session. Ce même problème se pose également avec Edge.

Quelqu'un a-t-il une expérience de ce problème ?

4voto

Kul-Tigin Points 12202

Le format de date attendu est documenté aquí . Vous devez produire la date d'expiration de cette manière.

En ASP classique, vous pouvez utiliser le JavaScript côté serveur pour produire facilement de telles dates.

<!--#include file="HTTPDate.asp"-->
<%
Response.AddHeader "Set-Cookie", "testCookie=2000; path=/;HttpOnly;Secure;expires=" & HTTPDate(DateAdd("d", 365, Now())) & ";samesite=Strict;HostOnly"
%>

HTTPDate.asp

<script language="javascript" runat="server">
function HTTPDate(vbsDate){
    return (new Date(vbsDate)).toGMTString().replace(/UTC/, "GMT");
}
</script>

Edit : Ajout d'une solution purement VBScript.

<%
Function CurrentTZO()
    With CreateObject("WScript.Shell") 
        CurrentTZO = .RegRead( _ 
        "HKLM\System\CurrentControlSet\Control\TimeZoneInformation\ActiveTimeBias")
    End With
End Function

Function Pad(text)
    Pad = Right("00" & text, 2)
End Function

Function HTTPDate(ByVal localDate)
    localDate = DateAdd("n", CurrentTZO(), localDate)

    ' WeekdayName and MonthName functions relies on locale
    ' need to produce day and month name abbreviations in en-US locale
    Dim locale : locale = SetLocale("en-US")

    Dim out(5)
    out(0) = WeekdayName(Weekday(localDate), True) & ","
    out(1) = Pad(Day(localDate))
    out(2) = MonthName(Month(localDate), True)
    out(3) = Year(localDate)
    out(4) = Join(Array(Pad(Hour(localDate)), Pad(Minute(localDate)), Pad(Second(localDate))), ":")
    out(5) = "GMT"

    SetLocale locale ' set original locale back 

    HTTPDate = Join(out, " ")
End Function

Response.AddHeader "Set-Cookie", "testCookie=2000; path=/;HttpOnly;Secure;expires=" & HTTPDate(DateAdd("d", 365, Now())) & ";samesite=Strict;HostOnly"
%>

0voto

M.Y. Points 90

En plus de la solution acceptée de Kul-Tigin, je veux aussi ajouter une solution vbscript pour ceux qui n'en ont pas.

<%
Response.AddHeader "Set-Cookie", "testCookie=2000; path=/;HttpOnly;Secure;expires=" & (New UTC).toUTCString(500,"d") & ";samesite=Strict;HostOnly;"

Class UTC

    Public Function toUTCString(ByVal offSet, ByVal offsetType)
        ' ***********************************
        ' Converts vbScript datetime format to 
        ' Universal datetime string format:
        ' Tue, 16 Feb 2021 13:39:24 GMT
        '************************************

        Dim dt: dt = dateAdd(offsetType, offSet, UTCDate(Now()))
        Dim tdParts: tdParts = Split(dt, " ")
        Dim tPart: tPart = CDate(tdParts(1) & " " & tdParts(2))
        Dim dPart: dPart = CDate(tdParts(0))

        Dim timeTo24: timeTo24 = _
        Right("0" & Hour(tPart), 2) & ":" & _
        Right("0" & Minute(tPart), 2) & ":" & _
        Right("0" & Second(tPart), 2)

        toUTCString = WeekdayName(Weekday(dPart), True) & ", " & _
                      Day(dPart) & " " & _
                      MonthName(Month(dPart), True) & " " & _
                      Year(dPart) & " " & _
                      timeTo24 & " GMT"

    End Function

    Public Function UTCDate(ByVal dtDate)
        If Not IsDate(dtDate) Then Err.Raise 5
        dtDate = CDate(dtDate)
        Dim ZoneBias: ZoneBias = TimeZoneBias()
        If IsPDT(Now) <> IsPDT(dtDate) Then
            ZoneBias = ZoneBias - 60
        End If
        UTCDate = DateAdd("n", ZoneBias, dtDate)
    End Function

    Private Function IsPDT(ByVal dtDate)
        If Not IsDate(dtDate) Then Err.Raise 5
        dtDate = CDate(dtDate)
        Dim pdtLow, pdtUpr, nDaysBack

        pdtLow = DateSerial(Year(dtDate),  3, 31)
        pdtUpr = DateSerial(Year(dtDate), 10, 31)
        pdtLow = DateAdd("h", 2, pdtLow)
        pdtUpr = DateAdd("h", 2, pdtUpr)

        nDaysBack = Weekday(pdtLow) - 1
        If nDaysBack <> 0 Then
            pdtLow = DateAdd("d", -nDaysBack, pdtLow)
        End If

        nDaysBack = Weekday(pdtUpr) - 1
        If nDaysBack <> 0 Then
            pdtUpr = DateAdd("d", -nDaysBack, pdtUpr)
        End If

        IsPDT = (dtDate >= pdtLow And dtDate <= pdtUpr)
    End Function

    Private Function TimeZoneBias()
        Dim LTZone
        With GetObject("winmgmts:" & _
                "{impersonationLevel=impersonate}!\\.\root\cimv2")
            For Each LTZone In .ExecQuery(_
                    "Select * From Win32_ComputerSystem")
                TimeZoneBias = LTZone.CurrentTimeZone
            Next
        End With
        TimeZoneBias = TimeZoneBias * -1
    End Function

End Class

%>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X