如何从 WebBrowser Control 中为任意域设置和删除 cookie

Posted

技术标签:

【中文标题】如何从 WebBrowser Control 中为任意域设置和删除 cookie【英文标题】:How to set and delete cookies from WebBrowser Control for arbitrary domains 【发布时间】:2010-12-13 22:11:02 【问题描述】:

如何在不使用 javascript 的情况下在网络浏览器控制中设置和删除域的 cookie(如果不先导航到网站,则不允许设置/删除 cookie。

【问题讨论】:

您对此有什么要求/场景? “来自网络浏览器控制”可能不是必需的。你有网站的控制权吗?如果这样做,您可以在 HttpRequest 中添加和删除 cookie,并且该 API 允许您指定 cookie 域。 我有一个浏览器,我想添加修改给定网站所有 cookie 的功能。 【参考方案1】:

通过结合这两个来完成这项任务:

http://support.microsoft.com/kb/815718

和 INTERNET_OPTION_END_BROWSER_SESSION - http://msdn.microsoft.com/en-us/library/windows/desktop/aa385328(v=vs.85).aspx

【讨论】:

我浏览了这些 URL,但没有找到任何解决方案。你能给我一个简短的解决方案吗?过去 10 天我遇到了同样的问题 @dr.evil 您能否提供一个关于您为解决此问题所做的工作的摘要?... 仅链接的答案在 SO 中不太好。【参考方案2】:

希望对你有帮助

using System.Runtime.InteropServices;

namespace Storm8

    class Program
    

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

        [DllImport("wininet.dll", CharSet = CharSet.Auto, SetLastError = true)]
        private static extern bool InternetGetCookie(
            string lpszUrlName,
            string lpszCookieName,
            StringBuilder lpszCookieData,
            [MarshalAs(UnmanagedType.U4)]
            ref int lpdwSize
        );

        [DllImport("wininet.dll", CharSet = CharSet.Auto, SetLastError = true)]
        private static extern bool InternetSetCookie(
            string lpszUrlName,
            string lpszCookieName,
            string lpszCookieData
        );

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



        [STAThread]
        static void Main(string[] args)
        
            InternetSetOption(0, 42, null, 0);
            InternetSetCookie("http://domain.name.com", "cookiename", "cookievalue");

            WebBrowser wb = new WebBrowser();
            string testUrl = "http://domain.name.com/fight.php?showAttackBg=true";
            string additionalHeaders = "User-Agent: Mozilla/5.0 (iPhone; U; CPU iPhone OS 3_0 like Mac OS X; en-us) AppleWebKit /528.18 (Khtml, like Gecko) Mobile/7A341" + Environment.NewLine +
                "Accept: application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5" + Environment.NewLine +
                "Accept-Language: en-gb";

            if (wb.Document == null)
                wb.Navigate(testUrl, null, null, additionalHeaders);

            while (wb.Document == null)
                Application.DoEvents();

            Console.WriteLine("\nPress any key to continue...");
            Console.ReadKey(true);
        
    

Reference

【讨论】:

我不明白.. 如何从 URI 中删除 cookie?【参考方案3】:

IE 使用 WinInet 函数进行联网,因此您可以使用 WinInet's cookie functions 更改 cookie。 更新:要求要求按流程设置。由于缓存文件夹位置未存储在 IE 设置注册表项 IDocHostUIHandler2::GetOverrideKeyPath 将不起作用。我不知道在进程级别自定义 cookie 文件夹位置的方法,除了挂钩所有 WinInet API(并且坚持更新应用程序以适应未来的 WinInet API)。

【讨论】:

不是整个 IE 吗?我不想删除用户的 IE 浏览器 cookie,它应该只适用于当前应用程序的托管 Web 控件。如果我错了,请纠正我。 如果您想隔离应用程序的 cookie,您需要通过 IDocHostUIHandler2::GetOverrideKeyPath 覆盖缓存目录注册表设置 我不确定 GetOverrideKeyPath 技巧是否会奏效。无论哪种方式,您都需要使用 InternetSetCookieEx。 是的,你没看错,IE缓存文件夹设置不在IE设置下。它在 shell 文件夹设置下。【参考方案4】:

这是一个更好的解决方案,只清除 cookie (C/C++):

#include <wininet.h>
#include <winineti.h>
...
DWORD dwSuppress = INTERNET_SUPPRESS_COOKIE_PERSIST;
InternetSetOption(0, INTERNET_OPTION_SUPPRESS_BEHAVIOR, &dwSuppress, sizeof(DWORD));

所有归功于this blog post (C#)。不要忘记查看InternetSetOption 和INTERNET_SUPPRESS_COOKIE_PERSIST 的文档

【讨论】:

它不会清除 cookie。它做别的事情。在您的处理过程中,通常不会保留持久性 cookie。但是已经存在、已经存储的 cookie 完全不受影响。只需尝试在 Internet 选项中运行并查看实际的 cookie 列表。【参考方案5】:

这是一篇关于如何使用 wininet 在 WebBrowser 控件中删除 cookie 的博文。

http://web.archive.org/web/20140219074039/http://www.alphatecit.com.au/code-snippets/facebook-c-sdk-multiple-login-problem-resolved

【讨论】:

链接现在也失效了。在发布外部链接时,请提供一个简单的解决方案。【参考方案6】:

您不能删除当前站点域以外的域的 cookie。

要执行您的要求,您需要有权访问机器(即安装工具栏)。即使那样,它也很笨拙。

唯一的例外是,如果您位于 cookie 使用 * 通配符的域中,例如 *.***.com。如果您使用通配符更改 cookie,则所有子子域(即 blog.***.com)都将有权访问并查看对 cookie 所做的更改。

【讨论】:

来自“Webrowser Control”,这不是一个 Web 应用程序,它是 Winforms。

以上是关于如何从 WebBrowser Control 中为任意域设置和删除 cookie的主要内容,如果未能解决你的问题,请参考以下文章

如何在不影响 SYSTEM/IE 代理的情况下为 Webbrowser Control 设置代理

iframe 和 Javascript 完成后 WebBrowser Control DocumentCompleted

如何在 WebBrowser 控件中提交表单?

如何单击 webbrowser 控件中的按钮?

WebBrowser脚本错误的原因及Web Browser Control & Specifying the IE Version

MFC 中的 WebBrowser 控件 — 如何注入 Javascript?