上一篇关于cookies欺骗的随笔中,提到的解决方案是把密码MD5加密之后存入cookies中,确实这种方法实现了效果,不过把密码留在客户端等待着去被破解不是一个合适的方法,在此也感谢 @老牛吃肉 以及各位小伙伴们的热烈讨论。在这里改写了一下方案,记录一下。

废话不多说直接上代码:

先写一个DES加密类,可以直接拿走用,所以虽然是写DEMO也给单独拿出来了。

 using System;
using System.Data;
using System.Web.Security;
using System.Security.Cryptography;
using System.Text;
using System.IO; /// <summary>
/// DES 的摘要说明
/// </summary>
public class DES
{
public DES()
{} /// <summary>
/// 加密
/// </summary>
/// <param name="Text"></param>
/// <param name="sKey"></param>
/// <returns></returns>
public static string Encrypt(string Text, string sKey)
{
DESCryptoServiceProvider provider = new DESCryptoServiceProvider();
byte[] bytes = Encoding.Default.GetBytes(Text);
provider.Key = Encoding.ASCII.GetBytes(FormsAuthentication.HashPasswordForStoringInConfigFile(sKey, "md5").Substring(, ));
provider.IV = Encoding.ASCII.GetBytes(FormsAuthentication.HashPasswordForStoringInConfigFile(sKey, "md5").Substring(, ));
MemoryStream stream = new MemoryStream();
CryptoStream stream2 = new CryptoStream(stream, provider.CreateEncryptor(), CryptoStreamMode.Write);
stream2.Write(bytes, , bytes.Length);
stream2.FlushFinalBlock();
StringBuilder builder = new StringBuilder();
foreach (byte num in stream.ToArray())
{
builder.AppendFormat("{0:X2}", num);
}
return builder.ToString();
} /// <summary>
/// 以默认密钥加密
/// </summary>
/// <param name="Text"></param>
/// <returns></returns>
public static string Encrypt(string Text)
{
return Encrypt(Text, "http://www.cnblogs.com/webconfig");
} /// <summary>
/// 解密
/// </summary>
/// <param name="Text"></param>
/// <param name="sKey"></param>
/// <returns></returns>
public static string Decrypt(string Text, string sKey)
{
DESCryptoServiceProvider provider = new DESCryptoServiceProvider();
int num = Text.Length / ;
byte[] buffer = new byte[num];
for (int i = ; i < num; i++)
{
int num3 = Convert.ToInt32(Text.Substring(i * , ), 0x10);
buffer[i] = (byte)num3;
}
provider.Key = Encoding.ASCII.GetBytes(FormsAuthentication.HashPasswordForStoringInConfigFile(sKey, "md5").Substring(, ));
provider.IV = Encoding.ASCII.GetBytes(FormsAuthentication.HashPasswordForStoringInConfigFile(sKey, "md5").Substring(, ));
MemoryStream stream = new MemoryStream();
CryptoStream stream2 = new CryptoStream(stream, provider.CreateDecryptor(), CryptoStreamMode.Write);
stream2.Write(buffer, , buffer.Length);
stream2.FlushFinalBlock();
return Encoding.Default.GetString(stream.ToArray());
} /// <summary>
/// 以默认密钥解密
/// </summary>
/// <param name="Text"></param>
/// <returns></returns>
public static string Decrypt(string Text)
{
return Decrypt(Text, "http://www.cnblogs.com/webconfig");
}
}

Login

     protected void Page_Load(object sender, EventArgs e)
{
//为了方便演示,每次加载登录页面“归零”
Response.Cookies["uid"].Value = "";
}
protected void Button1_Click(object sender, EventArgs e)
{
//验证步骤略过,假设用户通过验证并且得到如下信息: int uid = ; //用户唯一ID
string username = "admin"; //用户名
string userpwd = ""; //用户密码 string uidstr = DES.Encrypt(uid.ToString()); //接下来要保存用户登录状态
Response.Cookies["uid"].Value = uidstr; //跳转到登录后的页面
Response.Redirect("Main.aspx"); }
protected void Button2_Click(object sender, EventArgs e)
{
//未经验证直接进入Main.aspx
Response.Redirect("Main.aspx");
}

Main

     protected void Page_Load(object sender, EventArgs e)
{
CheckLogin();
} private void CheckLogin()
{ if (Request.Cookies["uid"] != null && Request.Cookies["uid"].Value != "") //判断cookies是否存在
{
int uid = ;
try
{
uid = int.Parse(DES.Decrypt(Request.Cookies["uid"].Value));
}
catch //捕获 cookies参数错误:非正确的 DES加密格式 或者解密后类型无法转换为int
{
Response.Write("您尚未登陆,<a href='login.aspx'>点此登录</a>");
return;
} if (GetUserInfo(uid, "") != "") //判断UID 是否存在
{
Response.Write(GetUserInfo(uid, "username") + "已登录");
}
else
{
Response.Write("您尚未登陆,<a href='login.aspx'>点此登录</a>");
}
}
else
{
Response.Write("您尚未登陆,<a href='login.aspx'>点此登录</a>");
}
} /// <summary>
/// 模拟一个获取用户信息的方法
/// 然而实际操作中需要通过ID查询数据库来获取用户信息
/// 这里为了方便演示就直接return固定的值了
/// </summary>
/// <param name="uid"></param>
/// <param name="key"></param>
/// <returns></returns>
private string GetUserInfo(int uid, string key)
{
if (uid == ) //这里只设置uid为1的用户,其他的UID的用户不存在
{
switch (key)
{
case "username": return "admin";
case "password": return "";
default: return "null";
}
}
else
{
return "";
}
}

最后来看测试效果:

UID是加密过的字符串,如果用户想用通过修改cookies的方法,那么他需要满足一下两个条件

1,猜中其他用户的UID

2,猜中网站DES加密的密钥

最后通过UID和密钥进行加密,把cookies修改为加密后的字符串

不过,第一条可能可以猜中,但是第二条,一般情况下密钥管理的好的话是不会有太大问题的。

本例DEMO:http://files.cnblogs.com/webconfig/Cookies%E6%AC%BA%E9%AA%972.rar

本文出自 低调码农的笔记簿http://www.cnblogs.com/webconfig/p/3624831.html 转载请注明出处,如有谬误不当之处,欢迎指正拍砖,不胜感谢!!

再谈Cookies欺骗的更多相关文章

  1. [转载]再谈百度:KPI、无人机,以及一个必须给父母看的案例

    [转载]再谈百度:KPI.无人机,以及一个必须给父母看的案例 发表于 2016-03-15   |   0 Comments   |   阅读次数 33 原文: 再谈百度:KPI.无人机,以及一个必须 ...

  2. Cookies欺骗分析与防护

    今天来谈谈cookies欺骗是怎么回事以及如何避免. 用户在登录之后通常会保存用户信息,以便在其他需要权限的页面去验证用户信息是否具有访问权限. 有同学说我在登录的时候已经很注意SQL注入问题了,还有 ...

  3. Support Vector Machine (3) : 再谈泛化误差(Generalization Error)

    目录 Support Vector Machine (1) : 简单SVM原理 Support Vector Machine (2) : Sequential Minimal Optimization ...

  4. Unity教程之再谈Unity中的优化技术

    这是从 Unity教程之再谈Unity中的优化技术 这篇文章里提取出来的一部分,这篇文章让我学到了挺多可能我应该知道却还没知道的知识,写的挺好的 优化几何体   这一步主要是为了针对性能瓶颈中的”顶点 ...

  5. 浅谈HTTP中Get与Post的区别/HTTP协议与HTML表单(再谈GET与POST的区别)

    HTTP协议与HTML表单(再谈GET与POST的区别) GET方式在request-line中传送数据:POST方式在request-line及request-body中均可以传送数据. http: ...

  6. Another Look at Events(再谈Events)

    转载:http://www.qtcn.org/bbs/simple/?t31383.html Another Look at Events(再谈Events) 最近在学习Qt事件处理的时候发现一篇很不 ...

  7. C++ Primer 学习笔记_32_STL实践与分析(6) --再谈string类型(下)

    STL实践与分析 --再谈string类型(下) 四.string类型的查找操作 string类型提供了6种查找函数,每种函数以不同形式的find命名.这些操作所有返回string::size_typ ...

  8. 再谈JSON -json定义及数据类型

    再谈json 近期在项目中使用到了highcharts ,highstock做了一些统计分析.使用jQuery ajax那就不得不使用json, 可是在使用过程中也出现了非常多的疑惑,比方说,什么情况 ...

  9. C++ Primer 学习笔记_44_STL实践与分析(18)--再谈迭代器【下】

    STL实践与分析 --再谈迭代器[下] 三.反向迭代器[续:习题] //P355 习题11.19 int main() { vector<int> iVec; for (vector< ...

随机推荐

  1. C#制作ActiveX控件及部署升级(摘自网络)

    使用C#开发ActiveX控件 控件开发.制作CAB包.签名.部署 ActiveX控件以前也叫做OLE控件,它是微软IE支持的一种软件组件或对象,可以将其插入到Web页面中,实现在浏览器端执行动态程序 ...

  2. How to create Managed Metadata Column

    This article introduce how to create/use managed metadata column from List. First, we need to config ...

  3. JQuery整体大纲

    今天公司放假,闲的无聊,就总结了一套JQuery的笔记,我感觉更像是大纲,在这里跟大家分享一下,这是我的成果: 这个就是我的劳动成果了,说实话真是不容易,为了做这个东西,翻阅了很多以前做过的笔记,发现 ...

  4. js渲染引擎 tempo.js

    1.引入tempo.js <script src="js/tempo.js" type="text/javascript"></script& ...

  5. 转:PHP乱码问题,UTF-8(乱码)

    原文来自于:http://www.cnblogs.com/rickyNote/archive/2012/04/09/2438704.html 一.HTML页面转UTF-8编码问题 1.在head后,t ...

  6. Keil_uvision_4基本使用教程

    Keil C51 V9.00 即09年发布的最新版本uVision 4,版本外观改变比较大,可以使用以前的注册文件.如果全新安装,在VISTA或者WIN 7系统下,请使用管理员方式运行,然后注册即可无 ...

  7. KEIL, a Smart Comliler

    KEIL是一个神的编译器.举一二例来说明: 1. 编译器出现WARNING"expression with possibly no effect",是提示你当前语在正做无用功,如在 ...

  8. haskell趣学指南笔记1

    网址:http://learnyouahaskell.com/ 中文版:http://learnyouahaskell-zh-tw.csie.org/zh-cn/ready-begin.html 在 ...

  9. haskell 开发环境配置

    haskell是一门通用函数式语言,几乎可以进行任何种类的开发,包括命令行,GUI,数据库,Web.源代码可以跨平台: Linux,Mac, Windows, FreeBSD 等. haskell特点 ...

  10. 使用getGenericSuperclass()和getActualTypeArguments()将DAO做成泛型

    一.getGenericSuperclass()和getActualTypeArguments()基本用法: import java.lang.reflect.ParameterizedType; p ...