web-dev-qa-db-ja.com

windows.formからCookieを削除する方法

C#で記述されたwindows.formアプリケーションでWebブラウザーコントロールを使用しています。特定のサイトにアクセスした後、WebbrowersコントロールからCookieを削除するメソッドを記述したいと思います。残念ながら、私はそれを正確に行う方法を知りません、そしてインターネットで多くの助けを見つけませんでした。

誰かが実際にこれを行った経験があるとすれば、それは見かけよりトリッキーである可能性があるため、単なる仮説ではありませんが、わかりません。

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

上記のコードのようなものが機能すると思いますが、機能しないと思います。誰もがこのクッキー全体にいくつかの光を当てることができますか?

23
Proximo

JavaScriptを有効にしている場合は、このコードスニペットを使用して、Webブラウザーが現在オンになっているサイトの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());}}}})())")

このブックマークレット から派生し、Cookieをクリアします。

25
Jordan Milne

私はここからソリューションを変更しました: 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

13
Sergey Belikov

すべての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のみをクリアすることに注意してください。

プロセス全体で動作を抑制するために使用される汎用オプション。

10
mr.baby123

安全でないコードや手動のマーシャリングを必要としない、他の提案された回答のバリアント:

    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

これを使ってみてください:

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

internet Explorerに基づくWebブラウザーコントロールなので、IE= Cookieを削除すると、WebブラウザーCookieも削除されます。 this 回答で、次のように試すことができます。

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

Webブラウザーコントロールは、開発者として制御できない複数のサイトからなるページを表示しますか、それともWebブラウザーコントロールを使用して、アプリケーション内で作成されたカスタムHTMLページを表示しますか?

前者の場合、Cookieはそれらを設定するドメインに直接関連付けられているため、これらのCookieを削除するには、ユーザーのCookieディレクトリを監視し、作成された新しいCookieを削除する必要があります。

後者の場合は、サーバー側のスクリプト(アプリケーションで使用可能な場合)またはJavaScriptを使用して、いつでもCookieを削除するカスタムページにWebブラウザーコントロールを送信できます。

1
Peter Lange

WebブラウザーC#でセッションを破棄する方法を見つけた素晴らしい時間の後、私はコードを使用して成功しました:

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( "xxx");を使用する必要があります。

c#プロパティを使用する場合、ここでは機能しません。

この情報がお役に立てば幸いです。

0
diangelisj

私はこのコードを使用しており、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を期限切れにするために重要です。

落とし穴:

  • 削除できるのは、移動先のWebサイトのCookieのみです。
  • ページが別のドメインにリダイレクトされる場合、削除したCookieはリダイレクトされたドメインからのものである可能性があります。かどうか、それはリダイレクトとコードの間の競争です。
  • ReadyState = WebBrowserReadyState.CompleteまでDocumentにアクセスしないでください。アクセスしない場合、DocumentはNothingになり、逆参照によって例外がスローされます。
  • おそらく他にもたくさんありますが、このコードは私にとってはうまくいきます。

View Cookies Add-On を備えたFirefoxは、特定のWebページのデバッグに大いに役立ちました。

0
Eyal