获取HttpOnly的cookie

/// <summary>
/// 获取HttpOnly的cookie
/// 调用方式如下
/* String hostName = theBrowser.Url.Scheme + Uri.SchemeDelimiter + theBrowser.Url.Host;
Uri hostUri = new Uri(hostName);
string cookieStr = CookieHelper.GetCookieInternal(hostUri, false);
MatchCollection mc = Regex.Matches(cookieStr + ";", @"(.*?)=(.*?);");
foreach (Match mcookie in mc)
{
Cookie cklogin = new Cookie(mcookie.Groups[1].Value.Trim(), mcookie.Groups[2].Value);
cklogin.Domain = ".taobao.com";
cklogin.Path = "/";
WebCookie.Add(cklogin);
}
*/
/// </summary>
public class CookieHelper
{
[SecurityCritical]
public static string GetCookieInternal(Uri uri, bool throwIfNoCookie)
{
uint pchCookieData = 0;

string url = UriToString(uri);
uint flag = (uint)NativeMethods.InternetFlags.INTERNET_COOKIE_HTTPONLY;

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();
}
}

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
}

时间: 2024-10-25 14:30:59

获取HttpOnly的cookie的相关文章

使用HttpOnly提升Cookie安全性

Http是无状态的,http是不会为了下一次连接而维护这次连接所传输的信息的.所以为了在每次会话之间传递信息,就需要用到cookie和session,很多时候都是在cookie中存储一个sessionID,服务器来识别该用户,那么安全隐患也就引申而出了,只要获得这个cookie,就可以取得别人的身份,特别是管理员等高级权限帐号时,危害就大了,而XSS就是在别人的应用程序中恶意执行一段JS以窃取用户的cookie. 在浏览器中的document对象中,就储存了Cookie的信息,而利用js可以把这

HttpOnly 与cookie安全

在xss攻击中,有种方式便是身份伪造,攻击者通过恶意脚本获取用户的cookie信息,以此cookie信息伪造真实用户去访问用户的私密空间. 在本片文章中,我们谈及httponly与cookied的安全问题. httponly最早由微软提出,即浏览器禁止页面js访问带有HttpOnly属性的cookie.HttpOnly并不直接对抗XSS攻击,只是防止XSS攻击者窃取cookie.对于存放敏感信息的cookie,可以通过设置该属性来避免攻击者窃取cookie. 下面谈谈如何开启HttpOnly属性

获取WebBrowser全cookie 和 httpWebRequest 异步获取页面数据

获取WebBrowser全cookie [DllImport("wininet.dll", CharSet = CharSet.Auto, SetLastError = true)] static extern bool InternetGetCookieEx(string pchURL, string pchCookieName, StringBuilder pchCookieData, ref int pcchCookieData, int dwFlags, object lpRe

获取和设置cookie的方法(5种)

//--------------------------11111111111 var createCookie = function (a, b, c, d) { var d = d ? d : "/"; if (c) { var e = new Date; e.setTime(e.getTime() + 24 * c * 60 * 60 * 1e3); var f = "; expires=" + e.toGMTString() } else var f = &

使用Volley获取多个cookie

问题描述 最近接手了一个论坛性质的应用,因为流量小,网络请求频繁,所以选择使用Volley进行重构.因为默认Volley只是读取一个cookie,而这个项目使用了4个cookie,所以用户登录部分先使用原来的HttpClient来保存用户的登录cookie信息. 重构获取和发送内容部分重构基本能够顺利完成,只剩下cookie这个难题,网上找了很多资料,发现很多都是片面一讲,其实说的不对. 网上找到的方法(不能解决问题) 有时服务器会返回多个 Set-Cookie 值,而Volley默认只取第一个

把cookie以json形式返回,用js来set cookie.(解决手机浏览器未知情况下获取不到cookie)

1.继上一篇随笔,链接点我,解决手机端cookie的问题. 2.上次用cookie+redis实现了session,并且手机浏览器可能回传cookies有问题,所以最后用js取出cookie跟在请求的url后面. 3.但是今天发现了新的问题,js取cookie存的sessionId为空,情况如下: (1)QQ浏览器能获取某些cookie,另一些cookie获取为空,猜测是后台Response SetCookie的时候,手机端浏览器没能良好的接受. (2)UC浏览器测试正常. (3)Safari情

javaScript获取指定的cookie值

1.获取cookie的函数 function getCookie(cookieName) { var strCookie = document.cookie; var arrCookie = strCookie.split("; "); for(var i = 0; i < arrCookie.length; i++){ var arr = arrCookie[i].split("="); if(cookieName == arr[0]){ return ar

js设置、修改、获取、删除 cookie

.......: 上面这串省略号对于各种吐槽的声音: 因为在百度上看到的关于设置cookie的前几篇文章都是错误的: 里面给出的设置cookie的代码是这样的: function setCookie(name,value){    var Days = 30;    var exp = new Date();    exp.setTime(exp.getTime() + Days*24*60*60*1000);    document.cookie = name + "="+ esca

Web学习之----js 操作获取和设置 cookie

引自http://www.nowcoder.com/questionTerminal/eb4d2b3204b14545a78541440c43d969?orderByHotValue=0&done=0&pos=8&mutiTagIds=571&onlyReference=false // 创建cookie function setCookie(name, value, expires, path, domain, secure) { var cookieText = enc