散分一百,请教一个验证码的问题

skyaspnet 2010-07-01 12:37:48


一般来说,大家在项目中保存验证码是用Cookies还是Session比较多?

 如果是使用Session的话,那么是否是采用生成一个关键字保存在服务器端,

 然后在用户发送数据时进行比对?

 如果是使用Cookies的话,那么是否是在服务器端读取Cookies的值然后与用户发送的

 值进行比对?那么这里就存在安全的问题,一般来说如果加了密的话,客户端是不太好读取到明文

 的验证码值(可能还是有办法读取到Cookies的值并POST到服务器端,如果攻击者知道加密方法),

 除此以外,也存在验证码图片识别等方法,但是如果验证码图片比较复杂的话也不是那么好获取。

 请教各位大侠,谢谢!
...全文
215 48 打赏 收藏 转发到动态 举报
写回复
用AI写文章
48 条回复
切换为时间正序
请发表友善的回复…
发表回复
神-气 2011-04-22
  • 打赏
  • 举报
回复
用Session吧,然后用完了立马清除掉,cookie很容易被针对的。
skyaspnet 2010-07-04
  • 打赏
  • 举报
回复
结帖。。。
  • 打赏
  • 举报
回复
学习了
xf198903 2010-07-01
  • 打赏
  • 举报
回复
用我新开发的函数。 SuperSession()
dabaiwanfuweng 2010-07-01
  • 打赏
  • 举报
回复
什么意思?
wwfgu00ing 2010-07-01
  • 打赏
  • 举报
回复
是Session 比较多,cookie安全有问题,而且很多浏览器会不允许cookie
生成一个unique key 存到session就可以了
StillMiss 2010-07-01
  • 打赏
  • 举报
回复
貌似可以用代码实现删除生成的验证码图片的 刚还在网上看到了
StillMiss 2010-07-01
  • 打赏
  • 举报
回复
学习下 、
chl19871024 2010-07-01
  • 打赏
  • 举报
回复
Session 用完了就销毁!
xingshungames 2010-07-01
  • 打赏
  • 举报
回复
进来学习了。我之前用的是cookie。要是让我说为什么不用session,我也说不上来,就是不喜欢用session……悲剧
董小尾 2010-07-01
  • 打赏
  • 举报
回复
用的是session ,感觉比较方便!
但是,有大牛曾告诫我 不要用session

具体原因不详~~~~
zhulong1111 2010-07-01
  • 打赏
  • 举报
回复
[Quote=引用 35 楼 skyaspnet 的回复:]
引用 14 楼 zhulong1111 的回复:
晕验证码需要安全么??难道你的验证码不是展示给用户看的而是经过加密的~~~~!


不是这个意思,验证码如果设计得不好,是可以获取验证码值并且POST到服务器上的
[/Quote]不必想的那么复杂。无非验证码就是防止机器频繁提交数据之类的。。。。其余验证码还能有什么用啊?
skyaspnet 2010-07-01
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 kingboy2008 的回复:]
用Cookies比较好、

C# code
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.We……
[/Quote]

这样是用明文存的,不是太安全,用FIREBUG等工具是可以查看到COOKIES的值的
skyaspnet 2010-07-01
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 zhulong1111 的回复:]
晕验证码需要安全么??难道你的验证码不是展示给用户看的而是经过加密的~~~~!
[/Quote]

不是这个意思,验证码如果设计得不好,是可以获取验证码值并且POST到服务器上的
queen25 2010-07-01
  • 打赏
  • 举报
回复
cookie和session机制之间的区别与联系
具体来说cookie机制采用的是在客户端保持状态的方案。它是在用户端的会话状态的存贮机制,他需要用户打开客户端的cookie支持。cookie的作用就是为了解决HTTP协议无状态的缺陷所作的努力.
而session机制采用的是一种在客户端与服务器之间保持状态的解决方案。同时我们也看到,由于采用服务器端保持状态的方案在客户端也需要保存一个标识,所以session机制可能需要借助于cookie机制来达到保存标识的目的。而session提供了方便管理全局变量的方式

session是针对每一个用户的,变量的值保存在服务器上,用一个sessionID来区分是哪个用户session变量,这个值是通过用户的浏览器在访问的时候返回给服务器,当客户禁用cookie时,这个值也可能设置为由get来返回给服务器。

就安全性来说:当你访问一个使用session 的站点,同时在自己机子上建立一个cookie,建议在服务器端的SESSION机制更安全些.因为它不会任意读取客户存储的信息。

正统的cookie分发是通过扩展HTTP协议来实现的,服务器通过在HTTP的响应头中加上一行特殊的指示以提示浏览器按照指示生成相应的cookie

从网络服务器观点看所有HTTP请求都独立于先前请求。就是说每一个HTTP响应完全依赖于相应请求中包含的信息状态管理机制克服了HTTP的一些限制并允许网络客户端及服务器端维护请求间的关系。在这种关系维持的期间叫做会话(session)。

Cookies是服务器在本地机器上存储的小段文本并随每一个请求发送至同一个服务器。IETF RFC 2965 HTTP State Management Mechanism 是通用cookie规范。网络服务器用HTTP头向客户端发送cookies,在客户终端,浏览器解析这些cookies并将它们保存为一个本地文件,它会自动将同一服务器的任何请求缚上这些cookies



cookie和session机制区别与联系
具体来说cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案。同时我们也看到,由于采用服务器端保持状态的方案在客户端也需要保存一个标识,所以session机制可能需要借助于cookie机制来达到保存标识的目的,但实际上它还有其他选择。

cookie机制。正统的cookie分发是通过扩展HTTP协议来实现的,服务器通过在HTTP的响应头中加上一行特殊的指示以提示浏览器按照指示生成相应的cookie。然而纯粹的客户端脚本如JavaScript或者VBScript也可以生成cookie。而cookie的使用是由浏览器按照一定的原则在后台自动发送给服务器的。浏览器检查所有存储的cookie,如果某个cookie所声明的作用范围大于等于将要请求的资源所在的位置,则把该cookie附在请求资源的HTTP请求头上发送给服务器。
cookie的内容主要包括:名字,值,过期时间,路径和域。路径与域一起构成cookie的作用范围。若不设置过期时间,则表示这个cookie的生命期为浏览器会话期间,关闭浏览器窗口,cookie就消失。这种生命期为浏览器会话期的cookie被称为会话cookie。会话cookie一般不存储在硬盘上而是保存在内存里,当然这种行为并不是规范规定的。若设置了过期时间,浏览器就会把cookie保存到硬盘上,关闭后再次打开浏览器,这些cookie仍然有效直到超过设定的过期时间。存储在硬盘上的cookie可以在不同的浏览器进程间共享,比如两个IE窗口。而对于保存在内存里的cookie,不同的浏览器有不同的处理方式
session机制。session机制是一种服务器端的机制,服务器使用一种类似于散列表的结构(也可能就是使用散列表)来保存信息。

当程序需要为某个客户端的请求创建一个session时,服务器首先检查这个客户端的请求里是否已包含了一个session标识(称为session id),如果已包含则说明以前已经为此客户端创建过session,服务器就按照session id把这个session检索出来使用(检索不到,会新建一个),如果客户端请求不包含session id,则为此客户端创建一个session并且生成一个与此session相关联的session id,session id的值应该是一个既不会重复,又不容易被找到规律以仿造的字符串,这个session id将被在本次响应中返回给客户端保存。
保存这个session id的方式可以采用cookie,这样在交互过程中浏览器可以自动的按照规则把这个标识发挥给服务器。一般这个cookie的名字都是类似于SEEESIONID。但cookie可以被人为的禁止,则必须有其他机制以便在cookie被禁止时仍然能够把session id传递回服务器。
别递烟哥不会 2010-07-01
  • 打赏
  • 举报
回复
不太明白,我是来接分的
jkyweb 2010-07-01
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 aluogang 的回复:]
看只到了散分,我就进来接分的!~
[/Quote]
+1
mzjmicrosoft 2010-07-01
  • 打赏
  • 举报
回复

string chkCode = string.Empty;
//颜色列表,用于验证码、噪线、噪点
Color[] color ={ Color.Black, Color.Red, Color.Blue, Color.Green, Color.Orange,

Color.Brown, Color.DarkBlue };

//字体列表,用于验证码
string[] font ={ "Times New Roman", "MS Mincho", "Book Antiqua", "Gungsuh",

"PMingLiU", "Impact" };

//验证码的字符集,去掉了一些容易混淆的字符
char[] character ={ '2', '3', '4', '5', '6', '8', '9', 'A', 'B', 'C', 'D', 'E',

'F', 'G', 'H', 'J', 'K', 'L', 'M', 'N', 'P', 'R', 'S', 'T', 'W', 'X', 'Y' };

Random rnd = new Random();

//生成验证码字符串
for (int i = 0; i < 4; i++)
{
chkCode += character[rnd.Next(character.Length)];
}

//保存验证码的Cookie
HttpCookie anycookie = new HttpCookie("validateCookie");

anycookie.Values.Add("ChkCode", chkCode);

HttpContext.Current.Response.Cookies["validateCookie"].Values["ChkCode"] =

chkCode;

Bitmap bmp = new Bitmap(120, 30);

Graphics g = Graphics.FromImage(bmp);

g.Clear(Color.White);

//画噪线
for (int i = 0; i < 5; i++)
{
int x1 = rnd.Next(150);
int y1 = rnd.Next(30);
int x2 = rnd.Next(150);
int y2 = rnd.Next(30);
Color clr = color[rnd.Next(color.Length)];
g.DrawLine(new Pen(clr), x1, y1, x2, y2);
}

//画验证码字符串
for (int i = 0; i < chkCode.Length; i++)
{
string fnt = font[rnd.Next(font.Length)];
Font ft = new Font(fnt, 16);
Color clr = color[rnd.Next(color.Length)];
g.DrawString(chkCode[i].ToString(), ft, new SolidBrush(clr), (float)i * 20 +

20, (float)6);
}

//画噪点
for (int i = 0; i < 100; i++)
{
int x = rnd.Next(bmp.Width);
int y = rnd.Next(bmp.Height);
Color clr = color[rnd.Next(color.Length)];
bmp.SetPixel(x, y, clr);
}
//清除该页输出缓存,设置该页无缓存
Response.Buffer = true;

Response.ExpiresAbsolute = System.DateTime.Now.AddMilliseconds(0);

Response.Expires = 0;

Response.CacheControl = "no-cache";

Response.AppendHeader("Pragma", "No-Cache");

//将验证码图片写入内存流,并将其以"image/Png" 格式输出
MemoryStream ms = new MemoryStream();

try
{
bmp.Save(ms, ImageFormat.Png);
Response.ClearContent();
Response.ContentType = "image/Png";
Response.BinaryWrite(ms.ToArray());
}
finally
{
//显式释放资源
bmp.Dispose();
g.Dispose();
}



Cookie
aaa901229 2010-07-01
  • 打赏
  • 举报
回复
我想知道无法正确输入验证码怎办
qiqishardgel 2010-07-01
  • 打赏
  • 举报
回复
用session吧!
加载更多回复(28)

62,047

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧