求助获取验证码值 很简单的验证码送分 麻烦各位高手写下代码。成果获取本地址验证码者送分。http://domain.ename.cn/common/showcode.do 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 请求的页面是你自己的页面还是别人的? 如果是别人的,就要看他是把数字验证码存放在什么地方的了。。你的做法是假定了他把要对比的数字验证码存在了seesion里面,但是有可能他并没有存在session里面而是存在VIEWSTATE里面(针对asp.net)的呢?这个都不一定的,你可以尝试Response获取的页面把__VIEWSTATE值截取下来 然后以参数名为:__VIEWSTATE一起POST过去但是如果他的数字验证还有可能用其他方法存起来的也不一定哦如果是这样,那说明他在网站的安全性上做了考虑——————————还有哈,你的请求是分离请求 也就是说第一次:你请求了含有验证码页面的那个页面。。这次并没有请求验证码页面,也就是说此时没有验证码生成。第二次 你单独请求了验证码页面。这个时候验证码才生成 所以 你要测试的话应该这样测试才符合你程序的逻辑 1.打开含有验证码页面的那个页面。此时生成的验证码是忽略掉的 2.在上面页面中找到验证码页面 然后单独打开它,这时生成的验证码,才是你程序捕获到的验证码。你把这个验证码填在上面的页面中然后提交。。看下能不能出错 以上步骤才是你程序模拟的步骤哦所以你的测试方法:"但是我在网页中打开验证码页面,然后把网页中的验证码填写到我的程序中再POST回去就正确。 " 是不对的。。 这是个cookie值或者session值吧,可以用火狐浏览器把所用到的前者的名取出来,然后再通过自己写的程序调出这个值 生成一个图片,其中的内容可以放在ViewState或Session中保存,验证时加以判断即可. 给你一段我常用的代码吧,效果可能跟你发的那个图片的不一样,不过你自己稍作修改一下,就出来了。ImagePage.cs代码:using System;using System.Collections.Generic;using System.Web;using System.Drawing;using System.Drawing.Imaging;namespace NS.Page{ /// <summary> /// 验证码 /// </summary> public class ImagePage : System.Web.UI.Page { /// <summary> /// 随机码认证 /// </summary> /// <param name="code">生成认证长度</param> protected void DrawImage(int code) { string verifyCode = Number(code, false); Session["CheckCode"] = verifyCode; CreateImages(Session["CheckCode"].ToString()); } /// <summary> /// 生成随机数字 /// </summary> /// <param name="Length">生成长度</param> /// <param name="Sleep">是否要在生成前将当前线程阻止以避免重复</param> /// <returns></returns> public string Number(int Length, bool Sleep) { if (Sleep) System.Threading.Thread.Sleep(3); string result = ""; System.Random random = new Random(); for (int i = 0; i < Length; i++) { result += random.Next(10).ToString(); } return result; } /// <summary> /// /// 生成验证图片 /// /// </summary> /// /// <param name="checkCode">验证字符</param> protected void CreateImages(string checkCode) { int iwidth = (int)(checkCode.Length * 15); System.Drawing.Bitmap image = new System.Drawing.Bitmap(iwidth, 30); Graphics g = Graphics.FromImage(image); g.Clear(Color.LightCyan); //定义颜色 Color[] c = { Color.Black, Color.Red, Color.DarkBlue, Color.Green, Color.Orange, Color.Brown, Color.DarkCyan, Color.Purple, Color.SkyBlue }; //定义字体 string[] font = { "Verdana", "Microsoft Sans Serif", "Comic Sans MS", "Arial", "宋体", "Comic Sans MS" }; Random rand = new Random(); //随机输出噪点 for (int i = 0; i < 150; i++) { int x = rand.Next(image.Width); int y = rand.Next(image.Height); g.DrawPie(new Pen(Color.LightGray, 0), x, y, 6, 6, 1, 1); } //输出不同字体和颜色的验证码字符 for (int i = 0; i < checkCode.Length; i++) { int cindex = rand.Next(7); int findex = rand.Next(6); Font _font = new System.Drawing.Font(font[findex], 14, System.Drawing.FontStyle.Bold); Brush b = new System.Drawing.SolidBrush(c[cindex]); int ii = 4; if ((i + 1) % 2 == 0) { ii = 2; } g.DrawString(checkCode.Substring(i, 1), _font, b, 3 + (i * 12), ii); } //画一个边框 g.DrawRectangle(new Pen(Color.Red, 0), 100, 0, image.Width - 1, image.Height - 1); //输出到浏览器 System.IO.MemoryStream ms = new System.IO.MemoryStream(); image.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg); Response.ClearContent();//Response.ClearContent(); Response.ContentType = "image/Jpeg"; Response.BinaryWrite(ms.ToArray()); g.Dispose(); image.Dispose(); } }}Image.aspx.csusing System;using System.Collections.Generic;using System.Web;using System.Web.UI;using System.Web.UI.WebControls;using NS.Page;public partial class Common_Image : ImagePage{ protected void Page_Load(object sender, EventArgs e) { DrawImage(4); }}调用<script type="text/javascript" language="JavaScript"> var numkey = Math.random(); numkey = Math.round(numkey * 10000); document.write("<img src=\"../common/Image.aspx?k=" + numkey + "\" width=\"70\" height=\"20\" onClick=\"this.src+=Math.random()\" alt=\"图片看不清?点击重新得到验证码\" style=\"cursor:pointer;\" height=\"23\" hspace=\"4\""); </script>获取页面的验证码并验证string checkCode = Request.Form["txtCheckCode"];if (Session["CheckCode"].ToString() == checkCode){*********} using System;using System.Drawing;using System.Drawing.Imaging;using System.Web.UI;using System.Drawing.Drawing2D;using System.IO; /// <summary> /// 生成验证码的类 /// </summary> public class ValidateNumber { public ValidateNumber() { } /// <summary> /// 验证码的最大长度 /// </summary> public int MaxLength { get{return 10;} } /// <summary> /// 验证码的最小长度 /// </summary> public int MinLength { get{return 1;} } /// <summary> /// 生成验证码 /// </summary> /// <param name="length">指定验证码的长度</param> /// <returns></returns> public string CreateValidateNumber(int length) { int[] randMembers=new int[length]; int[] validateNums=new int[length]; string validateNumberStr=""; //生成起始序列值 int seekSeek=unchecked((int)DateTime.Now.Ticks); Random seekRand=new Random(seekSeek); int beginSeek=(int)seekRand.Next(0,Int32.MaxValue-length*10000); int[] seeks=new int[length]; for(int i=0;i<length;i++) { beginSeek+=10000; seeks[i]=beginSeek; } //生成随机数字 for(int i=0;i<length;i++) { Random rand=new Random(seeks[i]); int pownum=1*(int)Math.Pow(10,length); randMembers[i]=rand.Next(pownum,Int32.MaxValue); } //抽取随机数字 for(int i=0;i<length;i++) { string numStr=randMembers[i].ToString(); int numLength=numStr.Length; Random rand=new Random(); int numPosition=rand.Next(0,numLength-1); validateNums[i]=Int32.Parse(numStr.Substring(numPosition,1)); } //生成验证码 for(int i=0;i<length;i++) { validateNumberStr+=validateNums[i].ToString(); } return validateNumberStr; } /// <summary> /// 创建验证码的图片 /// </summary> /// <param name="containsPage">要输出到的page对象</param> /// <param name="validateNum">验证码</param> public void CreateValidateGraphic(Page containsPage,string validateNum) { Bitmap image=new Bitmap((int)Math.Ceiling(validateNum.Length*12.5),22); Graphics g=Graphics.FromImage(image); try { //生成随机生成器 Random random=new Random(); //清空图片背景色 g.Clear(Color.White); //画图片的干扰线 for(int i=0;i<25;i++) { int x1=random.Next(image.Width); int x2=random.Next(image.Width); int y1=random.Next(image.Height); int y2=random.Next(image.Height); g.DrawLine(new Pen(Color.Silver),x1,y1,x2,y2); } Font font=new Font("Arial",12,(FontStyle.Bold|FontStyle.Italic)); LinearGradientBrush brush=new LinearGradientBrush(new Rectangle(0,0,image.Width,image.Height), Color.Blue,Color.DarkRed,1.2f,true); g.DrawString(validateNum,font,brush,3,2); //画图片的前景干扰点 for(int i=0;i<100;i++) { int x=random.Next(image.Width); int y=random.Next(image.Height); image.SetPixel(x,y,Color.FromArgb(random.Next())); } //画图片的边框线 g.DrawRectangle(new Pen(Color.Silver),0,0,image.Width-1,image.Height-1); //保存图片数据 MemoryStream stream=new MemoryStream(); image.Save(stream,ImageFormat.Jpeg); //输出图片 containsPage.Response.Clear(); containsPage.Response.ContentType="image/jpeg"; containsPage.Response.BinaryWrite(stream.ToArray()); } finally { g.Dispose(); image.Dispose(); } } /// <summary> /// 得到验证码图片的长度 /// </summary> /// <param name="validateNumLength">验证码的长度</param> /// <returns></returns> public static int GetImageWidth(int validateNumLength) { return (int)(validateNumLength*12.5); } /// <summary> /// 得到验证码的高度 /// </summary> /// <returns></returns> public static double GetImageHeight() { return 22.5; }}这个可以生成验证码并且能获取验证码 简单!在服务端写一个随机数,也可以加字母或汉字,然后通过cookie值或者session发送到客户端。客户端这边吧这个随机数现实出来,再给他一个背景图,或者做成防盗链也行。只要用户能看清楚。然后与服务端对比就行了。 怎么有那么多人认为这是在生成验证码啊,明明是在问识别别人的验证码。这个看来只能用到图像的识别了,非高手是回答不上来的,真要有高手来回答的话(真正的高手一般都很忙,不参与讨论的,只写Blog),给300分都不嫌多啊。 protected void Page_Load(object sender, EventArgs e) { Response.Expires = -1; string checkCode = CreateRandomCode(4); Session["CheckCode"] = checkCode; CreateImage(checkCode); } private string CreateRandomCode(int codeCount) { string allChar = "0,1,2,3,4,5,6,7,8,9"; string[] allCharArray = allChar.Split(','); string randomCode = ""; int temp = -1; Random rand = new Random(); for (int i = 0; i < codeCount; i++) { if (temp != -1) { rand = new Random(i * temp * ((int)DateTime.Now.Ticks)); } int t = rand.Next(9); if (temp == t) { return CreateRandomCode(codeCount); } temp = t; randomCode += allCharArray[t]; } return randomCode; } private void CreateImage(string checkCode) { int iwidth = (int)(checkCode.Length * 11.5); System.Drawing.Bitmap image = new System.Drawing.Bitmap(iwidth, 18); Graphics g = Graphics.FromImage(image); Font f = new System.Drawing.Font("Lucida Handwriting", 10, System.Drawing.FontStyle.Bold); Brush b = new System.Drawing.SolidBrush(Color.White); //g.FillRectangle(new System.Drawing.SolidBrush(Color.Blue),0,0,image.Width, image.Height); g.Clear(Color.Black); g.DrawString(checkCode, f, b, 1, 0); Random rand = new Random(); for (int i = 0; i < 50; i++) { int red, green, blue; red = rand.Next(0, 255); green = rand.Next(0, 255); blue = rand.Next(0, 255); Pen blackPen = new Pen(Color.FromArgb(red, green, blue), 0); int y = rand.Next(image.Height); int x = rand.Next(image.Width); //g.DrawLine(blackPen, 0, y, image.Width, y); g.DrawEllipse(blackPen, x, y, 1, 1); } System.IO.MemoryStream ms = new System.IO.MemoryStream(); image.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg); Response.ClearContent(); Response.ContentType = "image/Jpeg"; Response.BinaryWrite(ms.ToArray()); g.Dispose(); image.Dispose(); } 它这个跟大部分生成验证码的方法是一样的,都是随机生成了一些数字,然后将它添加到Cookie中我刚才试了一下,可以获取到Cookie中的值了,不过它是经过加密了的,加密方式及是否能解密现在还不清楚 webbrowser如何获取正在网页当前的源代码? flash与.net 通信 求正则表达式 怎样获取ComboBox的第N项 小问题,帮帮忙。~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 救救我!帮小妹想哈办法嘛!顶的有分. 请教,奇怪的windows服务的问题 哪有vs.net2003下载,100分只要能下马上给!!! 请教:如何使用C#通过javaAccessBridge来获得swing窗口内控件信息 委托的匿名函数 webservice如何实现可选参数及如何返回可选结果? 简单的c#小语法问题
如果是别人的,就要看他是把数字验证码存放在什么地方的了。。你的做法是假定了他把要对比的数字验证码存在了seesion里面,但是有可能他并没有存在session里面而是存在VIEWSTATE里面(针对asp.net)的呢?这个都不一定的,你可以尝试Response获取的页面把__VIEWSTATE值截取下来 然后以参数名为:__VIEWSTATE一起POST过去但是如果他的数字验证还有可能用其他方法存起来的也不一定哦如果是这样,那说明他在网站的安全性上做了考虑
——————————
还有哈,你的请求是分离请求 也就是说
第一次:你请求了含有验证码页面的那个页面。。这次并没有请求验证码页面,也就是说此时没有验证码生成。
第二次 你单独请求了验证码页面。这个时候验证码才生成
所以 你要测试的话应该这样测试才符合你程序的逻辑
1.打开含有验证码页面的那个页面。此时生成的验证码是忽略掉的
2.在上面页面中找到验证码页面 然后单独打开它,这时生成的验证码,才是你程序捕获到的验证码。你把这个验证码填在上面的页面中然后提交。。看下能不能出错
以上步骤才是你程序模拟的步骤哦所以你的测试方法:
"但是我在网页中打开验证码页面,然后把网页中的验证码填写到我的程序中再POST回去就正确。 "
是不对的。。
ImagePage.cs代码:using System;
using System.Collections.Generic;
using System.Web;
using System.Drawing;
using System.Drawing.Imaging;namespace NS.Page
{
/// <summary>
/// 验证码
/// </summary>
public class ImagePage : System.Web.UI.Page
{
/// <summary>
/// 随机码认证
/// </summary>
/// <param name="code">生成认证长度</param>
protected void DrawImage(int code)
{
string verifyCode = Number(code, false);
Session["CheckCode"] = verifyCode;
CreateImages(Session["CheckCode"].ToString());
} /// <summary>
/// 生成随机数字
/// </summary>
/// <param name="Length">生成长度</param>
/// <param name="Sleep">是否要在生成前将当前线程阻止以避免重复</param>
/// <returns></returns>
public string Number(int Length, bool Sleep)
{
if (Sleep)
System.Threading.Thread.Sleep(3);
string result = "";
System.Random random = new Random();
for (int i = 0; i < Length; i++)
{
result += random.Next(10).ToString();
}
return result;
} /// <summary>
/// /// 生成验证图片
/// /// </summary>
/// /// <param name="checkCode">验证字符</param>
protected void CreateImages(string checkCode)
{
int iwidth = (int)(checkCode.Length * 15);
System.Drawing.Bitmap image = new System.Drawing.Bitmap(iwidth, 30);
Graphics g = Graphics.FromImage(image);
g.Clear(Color.LightCyan);
//定义颜色
Color[] c = { Color.Black, Color.Red, Color.DarkBlue, Color.Green, Color.Orange, Color.Brown, Color.DarkCyan, Color.Purple, Color.SkyBlue };
//定义字体
string[] font = { "Verdana", "Microsoft Sans Serif", "Comic Sans MS", "Arial", "宋体", "Comic Sans MS" };
Random rand = new Random();
//随机输出噪点
for (int i = 0; i < 150; i++)
{
int x = rand.Next(image.Width);
int y = rand.Next(image.Height);
g.DrawPie(new Pen(Color.LightGray, 0), x, y, 6, 6, 1, 1);
} //输出不同字体和颜色的验证码字符
for (int i = 0; i < checkCode.Length; i++)
{
int cindex = rand.Next(7);
int findex = rand.Next(6);
Font _font = new System.Drawing.Font(font[findex], 14, System.Drawing.FontStyle.Bold);
Brush b = new System.Drawing.SolidBrush(c[cindex]);
int ii = 4;
if ((i + 1) % 2 == 0)
{
ii = 2;
}
g.DrawString(checkCode.Substring(i, 1), _font, b, 3 + (i * 12), ii);
} //画一个边框
g.DrawRectangle(new Pen(Color.Red, 0), 100, 0, image.Width - 1, image.Height - 1);
//输出到浏览器
System.IO.MemoryStream ms = new System.IO.MemoryStream();
image.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
Response.ClearContent();//Response.ClearContent();
Response.ContentType = "image/Jpeg";
Response.BinaryWrite(ms.ToArray());
g.Dispose();
image.Dispose();
}
}
}Image.aspx.csusing System;
using System.Collections.Generic;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using NS.Page;public partial class Common_Image : ImagePage
{
protected void Page_Load(object sender, EventArgs e)
{
DrawImage(4);
}
}调用<script type="text/javascript" language="JavaScript">
var numkey = Math.random();
numkey = Math.round(numkey * 10000);
document.write("<img src=\"../common/Image.aspx?k=" + numkey + "\" width=\"70\" height=\"20\" onClick=\"this.src+=Math.random()\" alt=\"图片看不清?点击重新得到验证码\" style=\"cursor:pointer;\" height=\"23\" hspace=\"4\"");
</script>获取页面的验证码并验证
string checkCode = Request.Form["txtCheckCode"];
if (Session["CheckCode"].ToString() == checkCode)
{
*********
}
using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.Web.UI;
using System.Drawing.Drawing2D;
using System.IO;
/// <summary>
/// 生成验证码的类
/// </summary>
public class ValidateNumber
{
public ValidateNumber()
{
}
/// <summary>
/// 验证码的最大长度
/// </summary>
public int MaxLength
{
get{return 10;}
}
/// <summary>
/// 验证码的最小长度
/// </summary>
public int MinLength
{
get{return 1;}
}
/// <summary>
/// 生成验证码
/// </summary>
/// <param name="length">指定验证码的长度</param>
/// <returns></returns>
public string CreateValidateNumber(int length)
{
int[] randMembers=new int[length];
int[] validateNums=new int[length];
string validateNumberStr="";
//生成起始序列值
int seekSeek=unchecked((int)DateTime.Now.Ticks);
Random seekRand=new Random(seekSeek);
int beginSeek=(int)seekRand.Next(0,Int32.MaxValue-length*10000);
int[] seeks=new int[length];
for(int i=0;i<length;i++)
{
beginSeek+=10000;
seeks[i]=beginSeek;
}
//生成随机数字
for(int i=0;i<length;i++)
{
Random rand=new Random(seeks[i]);
int pownum=1*(int)Math.Pow(10,length);
randMembers[i]=rand.Next(pownum,Int32.MaxValue);
}
//抽取随机数字
for(int i=0;i<length;i++)
{
string numStr=randMembers[i].ToString();
int numLength=numStr.Length;
Random rand=new Random();
int numPosition=rand.Next(0,numLength-1);
validateNums[i]=Int32.Parse(numStr.Substring(numPosition,1));
}
//生成验证码
for(int i=0;i<length;i++)
{
validateNumberStr+=validateNums[i].ToString();
}
return validateNumberStr;
}
/// <summary>
/// 创建验证码的图片
/// </summary>
/// <param name="containsPage">要输出到的page对象</param>
/// <param name="validateNum">验证码</param>
public void CreateValidateGraphic(Page containsPage,string validateNum)
{
Bitmap image=new Bitmap((int)Math.Ceiling(validateNum.Length*12.5),22);
Graphics g=Graphics.FromImage(image);
try
{
//生成随机生成器
Random random=new Random();
//清空图片背景色
g.Clear(Color.White);
//画图片的干扰线
for(int i=0;i<25;i++)
{
int x1=random.Next(image.Width);
int x2=random.Next(image.Width);
int y1=random.Next(image.Height);
int y2=random.Next(image.Height);
g.DrawLine(new Pen(Color.Silver),x1,y1,x2,y2);
}
Font font=new Font("Arial",12,(FontStyle.Bold|FontStyle.Italic));
LinearGradientBrush brush=new LinearGradientBrush(new Rectangle(0,0,image.Width,image.Height),
Color.Blue,Color.DarkRed,1.2f,true);
g.DrawString(validateNum,font,brush,3,2);
//画图片的前景干扰点
for(int i=0;i<100;i++)
{
int x=random.Next(image.Width);
int y=random.Next(image.Height);
image.SetPixel(x,y,Color.FromArgb(random.Next()));
}
//画图片的边框线
g.DrawRectangle(new Pen(Color.Silver),0,0,image.Width-1,image.Height-1);
//保存图片数据
MemoryStream stream=new MemoryStream();
image.Save(stream,ImageFormat.Jpeg);
//输出图片
containsPage.Response.Clear();
containsPage.Response.ContentType="image/jpeg";
containsPage.Response.BinaryWrite(stream.ToArray());
}
finally
{
g.Dispose();
image.Dispose();
}
}
/// <summary>
/// 得到验证码图片的长度
/// </summary>
/// <param name="validateNumLength">验证码的长度</param>
/// <returns></returns>
public static int GetImageWidth(int validateNumLength)
{
return (int)(validateNumLength*12.5);
}
/// <summary>
/// 得到验证码的高度
/// </summary>
/// <returns></returns>
public static double GetImageHeight()
{
return 22.5;
}
}这个可以生成验证码并且能获取验证码
客户端这边吧这个随机数现实出来,再给他一个背景图,或者做成防盗链也行。只要用户能看清楚。
然后与服务端对比就行了。
这个看来只能用到图像的识别了,非高手是回答不上来的,真要有高手来回答的话(真正的高手一般都很忙,不参与讨论的,只写Blog),给300分都不嫌多啊。
{
Response.Expires = -1;
string checkCode = CreateRandomCode(4);
Session["CheckCode"] = checkCode;
CreateImage(checkCode);
}
private string CreateRandomCode(int codeCount)
{
string allChar = "0,1,2,3,4,5,6,7,8,9";
string[] allCharArray = allChar.Split(',');
string randomCode = "";
int temp = -1; Random rand = new Random();
for (int i = 0; i < codeCount; i++)
{
if (temp != -1)
{
rand = new Random(i * temp * ((int)DateTime.Now.Ticks));
}
int t = rand.Next(9);
if (temp == t)
{
return CreateRandomCode(codeCount);
}
temp = t;
randomCode += allCharArray[t];
}
return randomCode;
} private void CreateImage(string checkCode)
{
int iwidth = (int)(checkCode.Length * 11.5);
System.Drawing.Bitmap image = new System.Drawing.Bitmap(iwidth, 18);
Graphics g = Graphics.FromImage(image);
Font f = new System.Drawing.Font("Lucida Handwriting", 10, System.Drawing.FontStyle.Bold);
Brush b = new System.Drawing.SolidBrush(Color.White);
//g.FillRectangle(new System.Drawing.SolidBrush(Color.Blue),0,0,image.Width, image.Height);
g.Clear(Color.Black);
g.DrawString(checkCode, f, b, 1, 0);
Random rand = new Random();
for (int i = 0; i < 50; i++)
{
int red, green, blue;
red = rand.Next(0, 255);
green = rand.Next(0, 255);
blue = rand.Next(0, 255);
Pen blackPen = new Pen(Color.FromArgb(red, green, blue), 0);
int y = rand.Next(image.Height);
int x = rand.Next(image.Width);
//g.DrawLine(blackPen, 0, y, image.Width, y);
g.DrawEllipse(blackPen, x, y, 1, 1);
} System.IO.MemoryStream ms = new System.IO.MemoryStream();
image.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
Response.ClearContent();
Response.ContentType = "image/Jpeg";
Response.BinaryWrite(ms.ToArray());
g.Dispose();
image.Dispose();
}
我刚才试了一下,可以获取到Cookie中的值了,不过它是经过加密了的,加密方式及是否能解密现在还不清楚