如何从 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脚本错误的原因及Web Browser Control & Specifying the IE Version