Как удалить Cookies из windows.form? - PullRequest
23 голосов
/ 27 мая 2009

Я работаю с элементом управления Webbrowser в приложении windows.form, написанном на C #. Я хотел бы написать метод удаления файлов cookie из элемента управления веб-браузера после его посещения определенного сайта. К сожалению, я не знаю, как именно это сделать, и не нашел большой помощи в Интернете.

Если у кого-то есть опыт на самом деле, а не только гипотетически, потому что это может быть сложнее, чем кажется, я не знаю.

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

Я бы просто предположил, что что-то вроде приведенного выше кода будет работать, но я думаю, что это не так. Кто-нибудь может пролить свет на все это печенье?

Ответы [ 10 ]

25 голосов
/ 05 августа 2009

Если у вас включен JavaScript, вы можете просто использовать этот фрагмент кода, чтобы очистить файлы 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.

13 голосов
/ 25 февраля 2016

Я изменил решение отсюда: http://mdb -blog.blogspot.ru / 2013/02 / с-WinForms-WebBrowser-понятно-все-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 для очистки куки, когда браузер закрыт, как описано здесь: мультисчет Facebook

9 голосов
/ 17 февраля 2013

Я нашел решение для удаления всех куки. пример, найденный в URL, удаляет куки при запуске приложения (процесса).

http://mdb -blog.blogspot.com / 2013/02 / с-WinForms-WebBrowser-понятно-все-cookies.html

Решение использует InternetSetOption Функция, чтобы объявить веб-браузер, чтобы очистить все его содержимое.

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

Обратите внимание, что файлы cookie удаляются только для определенного ПРОЦЕССА, как написано в MSDN INTERNET_OPTION_SUPPRESS_BEHAVIOR :

Опция общего назначения, которая используется для подавления поведения на основа всего процесса.

3 голосов
/ 20 сентября 2016

Вариант других предложенных ответов, который не требует небезопасного кода или ручной сортировки:

    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 голосов
/ 23 октября 2009

Попробуйте использовать это:

System.IO.File.Delete(Environment.SpecialFolder.Cookies.ToString() + "cookiename");
1 голос
/ 14 августа 2017

контроль веб-браузера на основе Internet Explorer, поэтому, когда мы удаляем файлы cookie IE, файлы cookie веб-браузера также удаляются. так что этот ответ, вы можете попробовать это:

System.Diagnostics.Process.Start("CMD.exe","/C RunDll32.exe InetCpl.cpl,ClearMyTracksByProcess 2");
1 голос
/ 28 августа 2009
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 голос
/ 27 мая 2009

Показывает ли веб-браузер страницы, образующие несколько сайтов, над которыми вы, как разработчик, не контролируете или просто используете веб-браузер для просмотра пользовательских HTML-страниц, созданных в вашем приложении?

Если это первые файлы cookie, они напрямую связаны с доменом, который их устанавливает, и поэтому для удаления этих файлов cookie вам потребуется отслеживать каталог файлов cookie пользователей и удалять любые новые созданные файлы cookie, чтобы отслеживать изменения в существующих файлах cookie.

Если это более поздняя версия, вы всегда можете отправить элемент управления веб-браузера на пользовательскую страницу, которая удаляет файлы cookie с помощью серверных сценариев (если они доступны в вашем приложении) или JavaScript.

0 голосов
/ 19 сентября 2013

После того, как я нашел способ уничтожения сессий в браузере 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 голосов
/ 11 ноября 2009

Я использую этот код, и он работает без 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 могут быть из перенаправленного домена. Или нет, это гонка между перенаправлением и вашим кодом.
  • Не обращайтесь к Document до ReadyState = WebBrowserReadyState.Complete, в противном случае Document будет Nothing и разыменование вызовет исключение.
  • Возможно, много других, но этот код прекрасно работает для меня.

Firefox с надстройкой View Cookies очень помог в отладке определенных веб-страниц.

...