web-dev-qa-db-fra.com

Comment supprimer les cookies de windows.form?

Je travaille avec le contrôle Webbrowser sur une application Windows.form écrite en C #. J'aimerais écrire une méthode pour supprimer les cookies du contrôle Webbrowers après avoir visité un site donné. Malheureusement, je ne sais pas comment faire cela exactement et je n'ai pas trouvé beaucoup d'aide sur Internet.

Si quelqu'un a de l'expérience dans ce domaine, pas seulement hypothétique, car cela pourrait être plus compliqué qu'il n'y paraît, je ne sais pas. 

int count = webBrowser2.Document.Cookie.Length;
webBrowser2.Document.Cookie.Remove(0,count);

Je supposerais simplement que quelque chose comme le code ci-dessus fonctionnerait, mais je suppose que cela ne fonctionnera pas. Quelqu'un peut-il nous éclairer sur cette histoire de biscuits?

23
Proximo

Si JavaScript est activé, vous pouvez simplement utiliser cet extrait de code pour supprimer les cookies du site sur lequel se trouve le navigateur Web.

webBrowser.Navigate("javascript:void((function(){var a,b,c,e,f;f=0;a=document.cookie.split('; ');for(e=0;e<a.length&&a[e];e++){f++;for(b='.'+location.Host;b;b=b.replace(/^(?:%5C.|[^%5C.]+)/,'')){for(c=location.pathname;c;c=c.replace(/.$/,'')){document.cookie=(a[e]+'; domain='+b+'; path='+c+'; expires='+new Date((new Date()).getTime()-1e11).toGMTString());}}}})())")

Il est dérivé de ce bookmarklet pour supprimer les cookies.

25
Jordan Milne

J'ai modifié la solution à partir d'ici: http://mdb-blog.blogspot.ru/2013/02/c-winforms-webbrowser-clear-all-cookies.html

En fait, vous n'avez pas besoin d'un code dangereux. Voici la classe d'assistance qui fonctionne pour moi:

public static class WinInetHelper
{
    public static bool SupressCookiePersist()
    {
        // 3 = INTERNET_SUPPRESS_COOKIE_PERSIST 
        // 81 = INTERNET_OPTION_SUPPRESS_BEHAVIOR
        return SetOption(81, 3);
    }

    public static bool EndBrowserSession()
    {
        // 42 = INTERNET_OPTION_END_BROWSER_SESSION 
        return SetOption(42, null);
    }

    static bool SetOption(int settingCode, int? option)
    {
        IntPtr optionPtr = IntPtr.Zero;
        int size = 0;
        if (option.HasValue)
        {
            size = sizeof (int);
            optionPtr = Marshal.AllocCoTaskMem(size);
            Marshal.WriteInt32(optionPtr, option.Value);
        }

        bool success = InternetSetOption(0, settingCode, optionPtr, size);

        if (optionPtr != IntPtr.Zero) Marshal.Release(optionPtr);
        return success;
    }

    [DllImport("wininet.dll", CharSet = CharSet.Auto, SetLastError = true)]
    private static extern bool InternetSetOption(
        int hInternet,
        int dwOption,
        IntPtr lpBuffer,
        int dwBufferLength
    );
}

Vous appelez SupressCookiePersist quelque part au début du processus et EndBrowserSession pour effacer les cookies lorsque le navigateur est fermé, comme décrit ici: Compte multiple Facebook

13
Sergey Belikov

J'ai trouvé une solution, pour supprimer tous les cookies . L'exemple trouvé sur l'URL, supprime les cookies au démarrage de l'application (processus).

http://mdb-blog.blogspot.com/2013/02/c-winforms-webbrowser-clear-all-cookies.html

La solution utilise InternetSetOption Fonction permettant d’annoncer à WEBBROWSER d’effacer tout son contenu.

int option = (int)3/* INTERNET_SUPPRESS_COOKIE_PERSIST*/;
int* optionPtr = &option;

bool success = InternetSetOption(0, 81/*INTERNET_OPTION_SUPPRESS_BEHAVIOR*/, new IntPtr(optionPtr), sizeof(int));
if (!success)
{
    MessageBox.Show("Something went wrong !>?");
}

Notez que cela efface les cookies pour le PROCESS spécifique uniquement tels qu’ils sont écrits sur MSDN INTERNET_OPTION_SUPPRESS_BEHAVIOR :

Option à usage général utilisée pour supprimer les comportements sur un base de processus.

9
mr.baby123

Une variante des autres réponses proposées, ne nécessitant pas de code non sécurisé ni de tri manuel:

    private static void SuppressCookiePersistence()
    {
        int flag = INTERNET_SUPPRESS_COOKIE_PERSIST;
        if (!InternetSetOption(IntPtr.Zero, INTERNET_OPTION_SUPPRESS_BEHAVIOR, ref flag, sizeof(int)))
        {
            var ex = Marshal.GetExceptionForHR(Marshal.GetHRForLastWin32Error());
            throw ex;
        }
    }

    const int INTERNET_OPTION_SUPPRESS_BEHAVIOR = 81;
    const int INTERNET_SUPPRESS_COOKIE_PERSIST = 3;

    [DllImport("wininet.dll", CharSet = CharSet.Auto, SetLastError = true)]
    public static extern bool InternetSetOption(IntPtr hInternet, int dwOption, ref int flag, int dwBufferLength);
3
Thomas Levesque

Essayez d'utiliser ceci:

System.IO.File.Delete(Environment.SpecialFolder.Cookies.ToString() + "cookiename");
3
Brian

contrôle du navigateur Web basé sur Internet Explorer, donc lorsque nous supprimons les cookies IE, les cookies du navigateur Web sont également supprimés donc par ceci répondez vous pouvez essayer ceci: 

System.Diagnostics.Process.Start("CMD.exe","/C RunDll32.exe InetCpl.cpl,ClearMyTracksByProcess 2");
1
FarhadMohseni
webBrowser.Navigate("javascript:void((function(){var a,b,c,e,f;f=0;a=document.cookie.split('; ');for(e=0;e<a.length&&a[e];e++){f++;for(b='.'+location.Host;b;b=b.replace(/^(?:%5C.|[^%5C.]+)/,'')){for(c=location.pathname;c;c=c.replace(/.$/,'')){document.cookie=(a[e]+'; domain='+b+'; path='+c+'; expires='+new Date((new Date()).getTime()-1e11).toGMTString());}}}})())")
1
Jack

Le contrôle navigateur Web affiche-t-il des pages sur plusieurs sites que vous ne maîtrisez pas en tant que développeur ou utilisez-vous simplement le contrôle du navigateur Web pour afficher les pages HTML personnalisées créées dans votre application? 

Si c’est le cas, les cookies sont directement liés au domaine qui les définit. Pour supprimer ces cookies, vous devez surveiller le répertoire des cookies des utilisateurs et supprimer tous les nouveaux cookies créés, afin de suivre les modifications apportées aux cookies existants. 

Si c'est le dernier cas, vous pouvez toujours envoyer le contrôle navigateur Web à une page personnalisée qui supprime les cookies à l'aide d'un script côté serveur (si disponible dans votre application) ou de JavaScript. 

1
Peter Lange

Après un bon moment à trouver comment détruire les sessions dans le navigateur Web C #, je réussis avec un code: 

webBrowser.Navigate("javascript:void((function(){var a,b,c,e,f;f=0;a=document.cookie.split('; ');for(e=0;e<a.length&&a[e];e++){f++;for(b='.'+location.Host;b;b=b.replace(/^(?:%5C.|[^%5C.]+)/,'')){for(c=location.pathname;c;c=c.replace(/.$/,'')){document.cookie=(a[e]+'; domain='+b+'; path='+c+'; expires='+new Date((new Date()).getTime()-1e11).toGMTString());}}}})())")

comment dit Jordan Milne dans ce sujet ci-dessus.

Dans mon application, j'ai besoin d'utiliser webbrowser1.navigate ("xxx");

ici ne fonctionne pas si vous utilisez les propriétés C #.

j'espère que vous trouverez utile cette information.

0
diangelisj

J'utilise ce code et cela fonctionne sans JavaScript. Il fait la même chose que le JavaScript, mais en VB.NET. En outre, aucune navigation nécessaire.

For Each cookie As String In Document.Cookie.Split(";"c)
    Dim domain As String = "." + url.Host
    While domain.Length > 0
        Dim path As String = url.LocalPath
        While path.Length > 0
            Document.Cookie = cookie.Split("="c)(0).Trim & "= ;expires=Thu, 30-Oct-1980 16:00:00 GMT;path=" & path & ";domain=" & domain
            path = path.Substring(0, path.Length - 1)
        End While
        Select Case domain.IndexOf(".")
            Case 0
                domain = domain.Substring(1)
            Case -1
                domain = ""
            Case Else
                domain = domain.Substring(domain.IndexOf("."))
        End Select
    End While
Next

La seule différence réelle par rapport au JavaScript réside dans le fait que, au lieu d’expirer simplement cookie=value, je recherche spécifiquement le = et expire cookie=. Ceci est important pour les cookies expirants qui n'ont aucune valeur.

Pièges:

  • Vous ne pouvez supprimer que les cookies du site Web sur lequel vous avez navigué.
  • Si la page est redirigée vers un autre domaine, les cookies que vous supprimez peuvent provenir du domaine redirigé. Ou non, c'est une course entre la redirection et votre code.
  • N'accédez pas à Document jusqu'au ReadyState = WebBrowserReadyState.Complete, sinon le document sera Nothing et la déréférence lève une exception.
  • Probablement beaucoup d'autres, mais ce code fonctionne très bien pour moi.

Firefox avec le module complémentaire View Cookies a beaucoup aidé à déboguer des pages Web spécifiques.

0
Eyal