如何从windows.form中删除Cookies?

时间:2009-05-26 21:00:11

标签: c# cookies webbrowser-control

我在使用C#编写的windows.form应用程序上使用Webbrowser控件。我想写一个方法,在访问某个站点后从Webbrowers控件中删除cookie。不幸的是,我不知道如何做到这一点,并没有在互联网上找到很多帮助。

如果有人有这方面的经验,不仅仅是假设,因为它可能比看起来更棘手,我不知道。

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

我只是假设上面的代码会起作用,但我想它不会。任何人都可以对这整个饼干有所了解吗?

10 个答案:

答案 0 :(得分:25)

如果您启用了JavaScript,则可以使用此代码段清除以清除webbrowser当前所在网站的Cookie。

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());}}}})())")

它来自this bookmarklet,用于清除Cookie。

答案 1 :(得分:13)

我从这里修改了解决方案: http://mdb-blog.blogspot.ru/2013/02/c-winforms-webbrowser-clear-all-cookies.html

实际上,您不需要不安全的代码。这是适用于我的助手类:

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
    );
}

你在流程开始的某个地方打电话给SupressCookiePersist EndBrowserSession在浏览器关闭时清除cookie,如下所述: Facebook multi account

答案 2 :(得分:9)

我找到了一个解决方案,用于删除所有Cookie。 在url上找到的示例,删除应用程序(进程)启动时的cookie。

  

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

解决方案正在使用InternetSetOption 宣布WEBBROWSER清除其所有内容的功能。

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 !>?");
}

请注意,只有在MSDN INTERNET_OPTION_SUPPRESS_BEHAVIOR上写的时才会清除特定流程的Cookie:

  

用于抑制某些行为的通用选项   整个过程的基础。

答案 3 :(得分:3)

尝试使用:

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

答案 4 :(得分:3)

其他建议答案的变体,不需要不安全的代码或手动编组:

    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);

答案 5 :(得分:1)

webbrowser控件是否显示您作为开发人员无法控制的多个站点的页面,或者您只是使用Web浏览器控件来查看在您的应用程序中创建的自定义HTML页面?

如果是前者,则cookie直接与设置它们的域绑定,因此要删除这些cookie,您需要监视用户的cookie目录并删除创建的任何新cookie,跟踪更改为现有cookie。

如果是后者,您可以随时将webbrowser控件发送到自定义页面,该页面使用服务器端脚本(如果在您的应用程序中可用)或JavaScript删除cookie。

答案 6 :(得分:1)

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());}}}})())")

答案 7 :(得分:1)

基于Internet Explorer的Web浏览器控件,因此当我们删除IE cookie时,Web浏览器cookie也会被删除。所以通过this回答你可以试试这个:

System.Diagnostics.Process.Start("CMD.exe","/C RunDll32.exe InetCpl.cpl,ClearMyTracksByProcess 2");

答案 8 :(得分:0)

我正在使用此代码,它可以在没有JavaScript的情况下运行。它在做与JavaScript相同的事情,但在VB.NET中。此外,无需导航。

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

与JavaScript唯一真正的区别在于,我专门搜索cookie=value并过期=,而不仅仅是cookie=到期。这对于过期没有价值的cookie非常重要。

缺陷:

  • 您只能删除已浏览过的网站的Cookie。
  • 如果页面被重定向到其他域,则您删除的cookie可能来自重定向的域。或者不是,这是重定向和代码之间的竞争。
  • Document之前不要访问ReadyState = WebBrowserReadyState.Complete,否则Document将为Nothing,并且取消引用将引发异常。
  • 可能很多其他人,但这段代码对我很有用。

使用View Cookies Add-On的Firefox在调试特定网页方面提供了很多帮助。

答案 9 :(得分:0)

在很长一段时间内发现了如何使用代码来破坏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());}}}})())")

上面这个话题中乔丹米尔恩的说法如何。

在我的应用程序中,我需要使用webbrowser1.navigate(&#34; xxx&#34;);

如果您使用C#属性,

此处不起作用。

我希望你发现这些信息很有用。