在上一篇关于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欺骗的更多相关文章
-
[转载]再谈百度:KPI、无人机,以及一个必须给父母看的案例
[转载]再谈百度:KPI.无人机,以及一个必须给父母看的案例 发表于 2016-03-15 | 0 Comments | 阅读次数 33 原文: 再谈百度:KPI.无人机,以及一个必须 ...
-
Cookies欺骗分析与防护
今天来谈谈cookies欺骗是怎么回事以及如何避免. 用户在登录之后通常会保存用户信息,以便在其他需要权限的页面去验证用户信息是否具有访问权限. 有同学说我在登录的时候已经很注意SQL注入问题了,还有 ...
-
Support Vector Machine (3) : 再谈泛化误差(Generalization Error)
目录 Support Vector Machine (1) : 简单SVM原理 Support Vector Machine (2) : Sequential Minimal Optimization ...
-
Unity教程之再谈Unity中的优化技术
这是从 Unity教程之再谈Unity中的优化技术 这篇文章里提取出来的一部分,这篇文章让我学到了挺多可能我应该知道却还没知道的知识,写的挺好的 优化几何体 这一步主要是为了针对性能瓶颈中的”顶点 ...
-
浅谈HTTP中Get与Post的区别/HTTP协议与HTML表单(再谈GET与POST的区别)
HTTP协议与HTML表单(再谈GET与POST的区别) GET方式在request-line中传送数据:POST方式在request-line及request-body中均可以传送数据. http: ...
-
Another Look at Events(再谈Events)
转载:http://www.qtcn.org/bbs/simple/?t31383.html Another Look at Events(再谈Events) 最近在学习Qt事件处理的时候发现一篇很不 ...
-
C++ Primer 学习笔记_32_STL实践与分析(6) --再谈string类型(下)
STL实践与分析 --再谈string类型(下) 四.string类型的查找操作 string类型提供了6种查找函数,每种函数以不同形式的find命名.这些操作所有返回string::size_typ ...
-
再谈JSON -json定义及数据类型
再谈json 近期在项目中使用到了highcharts ,highstock做了一些统计分析.使用jQuery ajax那就不得不使用json, 可是在使用过程中也出现了非常多的疑惑,比方说,什么情况 ...
-
C++ Primer 学习笔记_44_STL实践与分析(18)--再谈迭代器【下】
STL实践与分析 --再谈迭代器[下] 三.反向迭代器[续:习题] //P355 习题11.19 int main() { vector<int> iVec; for (vector< ...
随机推荐
-
Provisioning Services 7.6 入门到精通系列之一:PVS前期规划
1. Provisioning Services 产品概述 Provisioning Services (简称PVS)采用了一种与传统映像解决方案截然不同的方法,从根本上改变了硬件与依托硬件而运行的 ...
-
oracle数据库--启动和关闭
oracle--启动 oracle数据库的启动过程包含3个步骤:启动实例->加载数据库->打开数据库 分步骤启动过程可以对数据库进行不同的维护操作,对应我们不同的需求. 启动模式: 1.s ...
-
Android的开发环境的发展演变
1.Android的开发环境: 之前大家都是安装eclipse,然后再下载安装sdk等插件,还需要配置比较麻烦.不过2013年,有了新的选择,在I/O大会上,谷歌推出新的Android开发环境——An ...
-
php方法 隐藏手机号中间四位
$num = "13966778888"$str = substr_replace($num,'****',3,4);
-
Java学习-033-JavaWeb_002 -- 网页标记语言JSP基础知识
JSP 是 Sun 公司提倡的一门网页技术标准.在 HTML 文件中,加入 Java 代码就构成了 JSP 网页,当 Web 服务器访问 JSP 请求的时候,首先执行其中的 Java 程序源码,然后以 ...
-
linux第4天 shell socket
$[ ] 表示形式告诉shell对方括号中的表达式求值 echo $[3+9] 赋值运算符 =,+=,-=,*=,/=,%=,&=,^=.|=,<<=,>>= let ...
-
【bzoj2333】 SCOI2011—棘手的操作
http://www.lydsy.com/JudgeOnline/problem.php?id=2333 (题目链接) 题意 N个节点维护一些操作.. Solution 我们用可并大根堆进行维护. 对 ...
-
周赛C题 LightOJ 1047 (DP)
C - C Time Limit:500MS Memory Limit:32768KB 64bit IO Format:%lld & %llu Description Th ...
-
【实战】静默安装-oracle 11.2.0.3 on centos 5.10
发现网上静默安装的文章非常多,乱七八糟,五花八门!来个扫盲的! centos 5.10 下安装oracle 11g_r2 ************************************* ...
-
IIS express 7.5 设置默认文档
在C:\Users\[电脑用户名]\Documents\IISExpress\config 下面有个applicationhost.config文件,打开文件找到<system.webServe ...