webBrowser.Document.Cookie取不到HttpOnly的Cookie,取Cookie不完整
2017-03-22 17:30
453 查看
在做数据采集时,有些网站需要输入验证码,但各网站验证码都不同,不可能有完美的识别验证码的代码,所以我也没去研究,我所采取的方案是:在winform里通过WebBrowser调用网页先手动登录系统,然后再通过webBrowser1.Document.Cookie获取其Cookie,再将其用到HttpWebRequest里用来访问自己需要的页。
一直用的都没有问题,但最近在对一个网站操作时总是不能获取完整Cookie,百思不得其解,使用Fiddler2对比发现,不能获取到的Cookie里最后有一个HttpOnly的标识,顺藤摸瓜发现原来webBrowser1.Document.Cookie里是取不到HttpOnly的Cookie的,也找到解决方法:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.ComponentModel;
using System.Net;
using System.Runtime.InteropServices;
using System.Security;
using System.Security.Permissions;
namespace ToutiaoTool
{
internal sealed class NativeMethods
{
#region enums
}
refer: http://blog.csdn.net/smeller/article/details/7022370
一直用的都没有问题,但最近在对一个网站操作时总是不能获取完整Cookie,百思不得其解,使用Fiddler2对比发现,不能获取到的Cookie里最后有一个HttpOnly的标识,顺藤摸瓜发现原来webBrowser1.Document.Cookie里是取不到HttpOnly的Cookie的,也找到解决方法:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.ComponentModel;
using System.Net;
using System.Runtime.InteropServices;
using System.Security;
using System.Security.Permissions;
namespace ToutiaoTool
{
internal sealed class NativeMethods
{
#region enums
public enum ErrorFlags { ERROR_INSUFFICIENT_BUFFER = 122, ERROR_INVALID_PARAMETER = 87, ERROR_NO_MORE_ITEMS = 259 } public enum InternetFlags { INTERNET_COOKIE_HTTPONLY = 8192, //Requires IE 8 or higher INTERNET_COOKIE_THIRD_PARTY = 131072, INTERNET_FLAG_RESTRICTED_ZONE = 16 } #endregion #region DLL Imports [SuppressUnmanagedCodeSecurity, SecurityCritical, DllImport("wininet.dll", EntryPoint = "InternetGetCookieExW", CharSet = CharSet.Unicode, SetLastError = true, ExactSpelling = true)] internal static extern bool InternetGetCookieEx([In] string Url, [In] string cookieName, [Out] StringBuilder cookieData, [In, Out] ref uint pchCookieData, uint flags, IntPtr reserved); #endregion } /// <SUMMARY></SUMMARY> /// 取得WebBrowser的完整Cookie。 /// 因为默认的webBrowser1.Document.Cookie取不到HttpOnly的Cookie /// public class FullWebBrowserCookie { [SecurityCritical] public static string GetCookieInternal(Uri uri, bool throwIfNoCookie) { uint pchCookieData = 0; string url = UriToString(uri); uint flag = (uint)NativeMethods.InternetFlags.INTERNET_COOKIE_HTTPONLY; //Gets the size of the string builder if (NativeMethods.InternetGetCookieEx(url, null, null, ref pchCookieData, flag, IntPtr.Zero)) { pchCookieData++; StringBuilder cookieData = new StringBuilder((int)pchCookieData); //Read the cookie if (NativeMethods.InternetGetCookieEx(url, null, cookieData, ref pchCookieData, flag, IntPtr.Zero)) { DemandWebPermission(uri); return cookieData.ToString(); } } int lastErrorCode = Marshal.GetLastWin32Error(); if (throwIfNoCookie || (lastErrorCode != (int)NativeMethods.ErrorFlags.ERROR_NO_MORE_ITEMS)) { throw new Win32Exception(lastErrorCode); } return null; } private static void DemandWebPermission(Uri uri) { string uriString = UriToString(uri); if (uri.IsFile) { string localPath = uri.LocalPath; new FileIOPermission(FileIOPermissionAccess.Read, localPath).Demand(); } else { new WebPermission(NetworkAccess.Connect, uriString).Demand(); } } private static string UriToString(Uri uri) { if (uri == null) { throw new ArgumentNullException("uri"); } UriComponents components = (uri.IsAbsoluteUri ? UriComponents.AbsoluteUri : UriComponents.SerializationInfoString); return new StringBuilder(uri.GetComponents(components, UriFormat.SafeUnescaped), 2083).ToString(); } }
}
refer: http://blog.csdn.net/smeller/article/details/7022370
相关文章推荐
- webBrowser1.Document.Cookie取不到HttpOnly的Cookie,取Cookie不完整【转】
- webBrowser1.Document.Cookie取不到HttpOnly的Cookie,取Cookie不完整
- [WebBrowser][Cookie] Document.Cookie 取得的Cookies不完整問題
- C#在WebBrowser下获取完整的Cookies(包括含HTTPOnly属性的)
- Retrieve HttpOnly Session Cookie in WebBrowser
- VB通过webbrowser获取httponly的cookie
- 使用csExWB Webbrowser 控件获取HttpOnly的cookie
- 浅谈HTTP Cookie 的 Secure 和 HTTPONLY属性
- 利用HTTP-only Cookie缓解XSS之痛
- Cookie的secure和httpOnly属性的含义
- 将WebBrowser的cookie信息传给HttpWebRequest
- httpOnly实现防止XSS时避免JavaScript读取cookie
- Tomcat7新特性?cookie HttpOnly的那些事(sessionid获取麻烦了)
- 如何为cookie设置HttpOnly
- 增加 cookie 安全性添加HttpOnly和secure属性
- PHP设置COOKIE的HttpOnly属性
- HttpWebResponse取不到Cookie?原来是因为被跳转了
- 浅谈HTTP Cookie 的 Secure 和 HTTPONLY属性
- C#利用WebBrowser获取完整COOKIE介绍
- window.open的popup-only-once问题(document.cookie)