Cookies

Este documento descreve como trabalhar com cookies.

Visão geral

O DotNetBrowser delega o trabalho com os cookies no Chromium engine. O Chromium decide como baixar os cookies de um servidor Web, extraí-los dos cabeçalhos HTTP e armazená-los num sistema de arquivos local (cookies persistentes) ou na memória (cookies de sessão).

A interface ICookieStore permite-lhe obter, modificar e remover cookies. A classe Cookie fornece informações sobre um determinado cookie.

Para obter o ICookieStore para um Profile específico, utilize o método Profiles.CookieStore(). O método IEngine.CookieStore() devolve o CookieStore associado ao perfil predefinido.

Protocolos suportados

O DotNetBrowser suporta cookies que são enviados usando os seguintes protocolos:

  • HTTP
  • HTTPS
  • WS (WebSocket)
  • WSS (WebSocket Seguro)

Se um cookie for enviado utilizando um protocolo que não conste da lista, por exemplo, ftp://, não será guardado no armazenamento de cookies.

Trabalhar com cookies

O DotNetBrowser suporta os seguintes tipos de cookies:

  • Cookies persistentes — armazenados na pasta de dados do usuário do Chromium. Se eliminar a pasta de dados do usuário do Chromium, todos os cookies persistentes serão também eliminados.
  • Cookies de sessão — armazenados na memória da aplicação e serão removidos automaticamente quando a aplicação for terminada.
  • Cookies seguros — só podem ser transmitidos através de uma ligação encriptada que é HTTPS. Isto torna o cookie menos suscetível de ser exposto ao roubo de cookies através de escutas.
  • Cookies HttpOnly — não podem ser acedidos pelas APIs do lado do cliente, como o JavaScript. Esta restrição elimina a ameaça de roubo de cookies utilizando o cross-site scripting (XSS). No entanto, o cookie continua vulnerável a ataques de rastreio entre sites (XST) e de falsificação de pedidos entre sites (XSRF).

Quando modificar os cookies, utilize o método ICookieStore.Flush() para guardar as alterações no armazenamento de cookies.

Obtendo cookies

Para obter todos os cookies, utilize o método GetAllCookies() :

engine.Profiles.Default.CookieStore.GetAllCookies()
    .Result.ToList().ForEach(cookie => Console.WriteLine("cookie = " + cookie));
engine.Profiles.Default.CookieStore.GetAllCookies().Result.ToList().
    ForEach(Sub(cookie) 
        Console.WriteLine("cookie = " & cookie.ToString())
    End Sub)

Para obter todos os cookies através de um URL, utilize o método GetAllCookies() com um parâmetro string:

engine.Profiles.Default.CookieStore.GetAllCookies("https://www.google.com")
    .Result.ToList().ForEach(cookie => Console.WriteLine("cookie = " + cookie));
engine.Profiles.Default.CookieStore.GetAllCookies("https://google.com").Result.ToList().
    ForEach(Sub(cookie)
        Console.WriteLine("cookie = " & cookie.ToString())
    End Sub)

Criando cookies

Persistente

Para criar um cookie persistente, utilize o exemplo de código abaixo:

Cookie cookie = new Cookie.Builder(".google.com")
{
    Name = "name",
    Value = "value",
    ExpirationTime = expirationTime,
    Path = "/"
}.Build();

bool success = engine.Profiles.Default.CookieStore.SetCookie(cookie).Result;
engine.Profiles.Default.CookieStore.Flush();
Dim cookie As Cookie = New Cookie.Builder(".google.com") With {
    .Name = "name",
    .Value = "value",
    .ExpirationTime = expirationTime,
    .Path = "/"
}.Build()

Dim success As Boolean = engine.Profiles.Default.CookieStore.SetCookie(cookie).Result
engine.Profiles.Default.CookieStore.Flush()

O exemplo de código acima cria um cookie persistente para o URL http://www.google.com . A variável success será true se o cookie for criado e adicionado ao armazenamento de cookies com êxito.

Sessão

Para criar um cookie de sessão, utilize o exemplo de código abaixo:

Cookie cookie = new Cookie.Builder(".google.com")
{
    Name = "name",
    Value = "value",
    Path = "/"
}.Build();

bool success = engine.Profiles.Default.CookieStore.SetCookie(cookie).Result;
engine.Profiles.Default.CookieStore.Flush();
Dim cookie As Cookie = New Cookie.Builder(".google.com") With {
    .Name = "name",
    .Value = "value",
    .Path = "/"
}.Build()

Dim success As Boolean = engine.Profiles.Default.CookieStore.SetCookie(cookie).Result
engine.Profiles.Default.CookieStore.Flush()

Cookies com prefixos específicos

Alguns cookies com nomes específicos têm uma semântica específica.

Os cookies com nomes que começam por __Host- devem ser definidos com o sinalizador seguro, devem provir de uma página segura (HTTPS), não devem ter um domínio especificado (e, por conseguinte, não são enviados para subdomínios) e o caminho deve ser /. O nome do domínio deve ser especificado através da API, mas neste caso é utilizado apenas para efeitos de validação.

Cookie cookie = new Cookie.Builder(".a.com")
{
    Name = "__Host-1PLSID",
    Value = "value",
    Secure = true,
    HttpOnly = false
}.Build();
bool success = engine.Profiles.Default.CookieStore.SetCookie(cookie).Result;
engine.Profiles.Default.CookieStore.Flush();
Dim cookie As Cookie = New Cookie.Builder(".a.com") With {
    .Name = "__Host-1PLSID",
    .Value = "value",
    .Secure = True,
    .HttpOnly = False
}.Build()
Dim success As Boolean = engine.Profiles.Default.CookieStore.SetCookie(cookie).Result
engine.Profiles.Default.CookieStore.Flush()

Os nomes dos cookies que começam por __Secure- (o traço faz parte do prefixo) devem ser definidos com o sinalizador seguro a partir de uma página segura (HTTPS). Eis como criar estes cookies:

Cookie cookie = new Cookie.Builder(".a.com")
{
    Name = "__Secure-Asd",
    Path = "/",
    Secure = true
}.Build();
bool success = engine.Profiles.Default.CookieStore.SetCookie(cookie).Result;
engine.Profiles.Default.CookieStore.Flush();
Dim cookie As Cookie = New Cookie.Builder(".a.com") With {
    .Name = "__Secure-Asd",
    .Path = "/",
    .Secure = True
}.Build()
Dim success As Boolean = engine.Profiles.Default.CookieStore.SetCookie(cookie).Result
engine.Profiles.Default.CookieStore.Flush()

Eliminando cookies

Para eliminar todos os cookies, utilize o método DeleteAllCookies() :

int numberOfDeletedCookies = engine.Profiles.Default.CookieStore.DeleteAllCookies().Result;
engine.Profiles.Default.CookieStore.Flush();
Dim numberOfDeletedCookies As Integer = 
        engine.Profiles.Default.CookieStore.DeleteAllCookies().Result
engine.Profiles.Default.CookieStore.Flush()

Para eliminar um cookie, utilize o método Delete(Cookie) . O exemplo de código abaixo elimina todos os cookies um a um, obtendo o resultado da operação:

engine.Profiles.Default.CookieStore.GetAllCookies().Result.ToList().ForEach(c => 
    engine.Profiles.Default.CookieStore.Delete(c).Wait());
engine.Profiles.Default.CookieStore.Flush();
engine.Profiles.Default.CookieStore.GetAllCookies().Result.ToList().ForEach(Function(c) 
        engine.Profiles.Default.CookieStore.Delete(c).Wait()
    End Function)
engine.Profiles.Default.CookieStore.Flush()

Supressão de cookies

Você pode controlar todos os cookies de entrada e de saída utilizando os manipuladores CanSetCookieHandler e CanGetCookiesHandler da rede Network.

Para suprimir os cookies de entrada, utilize o exemplo de código abaixo:

network.CanSetCookieHandler = 
    new Handler<CanSetCookieParameters, CanSetCookieResponse>(p =>
    {
        return CanSetCookieResponse.Deny());
    }
network.CanSetCookieHandler = 
    New Handler(Of CanSetCookieParameters, CanSetCookieResponse)(Function(p) 
        Return CanSetCookieResponse.Deny()
    End Function)

Para suprimir os cookies de saída, utilize o exemplo de código abaixo:

network.CanGetCookiesHandler = 
    new Handler<CanGetCookiesParameters, CanGetCookiesResponse>(p =>
    {
        return CanGetCookiesResponse.Deny());
    }
network.CanGetCookiesHandler = 
    New Handler(Of CanGetCookiesParameters, CanGetCookiesResponse)(Function(p)
        Return CanGetCookiesResponse.Deny()
    End Function)

Controle de cookies de terceiros

Você pode configurar a forma como o Chromium controla os cookies de terceiros:

  • Desligar o comando.
  • Bloquear cookies de terceiros.
  • Bloquear cookies de terceiros no modo de navegação anônima.

Veja as opções disponíveis em: CookieControlsMode enum.

Por exemplo:

IProfile profile = engine.Profile.Default;
profile.Preferences.ThirdPartyCookieMode = CookieControlsMode.BlockThirdParty;
Dim profile As IProfile = engine.Profile.Default
profile.Preferences.ThirdPartyCookieMode = CookieControlsMode.BlockThirdParty

Encriptação

O DotNetBrowser suporta a encriptação de cookies por padrão. Ele utiliza as rotinas de encriptação de cookies do Chromium, então os cookies são armazenados da mesma forma que no Chromium.

No Windows, o DotNetBrowser utiliza apenas a DPAPI para encriptar os cookies. Atualmente, não existem alternativas.

Go Top