思考验证码的用处
1.认为图片验证码没有什么用,并且也特别的烦人(每次上移动的网站都要频频地输入验证码),但人家要求,也只好弄一个。
2.验证码有用,有什么作用
比如某黑客获得一银行账号,然后打开账号的开户银行的网上银行登录界面。
(1)没有验证码,只需要输入用户名和密码就能进入。
黑客:马上写了一个程序,用来模拟浏览器向网上银行服务器提交账号和密码尝试登录。(枚举字典攻击 )由于取款密码是6位阿拉伯数字,黑客的电脑从六个零开始测试一直到六个九(也就有一百万种组合),这一定会测试出真正的密码。
黑客:找到一台宽带高速上网的电脑,假设这台电脑1秒能测试10个密码,于是花费10万秒的时间肯定能找到密码。10万秒也就是27小时,一天多点的时间,实际上很可能用不了那么长的时间。黑客外头转了一圈回来,发现密码已经找到了,于是马上登录网上银行捞钱,或者伪造一个银行卡去atm机上提取现金。也就是说黑客最多花了一天时间即可获得数目不可预知的非法收入。
(2)采用了验证码技术
用户登录时除了要输入账号和取款密码,浏览器还显示一个图片,里面显示了一些潦草的字符,用户需要辨认这些字符然后再输入进去,浏览器向服务器提交表单时会附加用户输入的验证码,服务器接受表单数据后除了校验账号和取款密码后,还要检查验证码是否输入正确,若登录信息校验失败,则服务器端则会提示重新登录,而且还生成包含随机内容的新的验证码,用户在次登录时又得重新识别新的验证码了。
由于正确的验证码文本是保存在服务器上的,客户端的黑客程序不可能获得,验证码的内容是随机的,黑客程序也无法找到规律,只能辨认从服务器端发出的包含验证码的图片来获得验证码。这里就体现了电脑和人脑的差别了,人脑在图形识别方面远远超过了目前的电脑,服务器端使用一些技术生成的书写潦草,充满随机分布的杂点的图片,人脑是可以相当容易的识别的,但目前的电脑是难以识别的。黑客程序无法识别验证码,只能显示图片让黑客亲自辨认,这时每测试一次密码,黑客都得仔细辨认一下验证码图片,然后手工输入验证码文本。最多要输入一百万次。
新建页面checkimage.aspx
checkimage.aspx.cs代码:
using system;
using system.collections;
using system.configuration;
using system.data;
using system.web;
using system.web.security;
using system.web.ui;
using system.web.ui.htmlcontrols;
using system.web.ui.webcontrols;
using system.web.ui.webcontrols.webparts;
using system.drawing;
using system.io;
namespace jgy_keshi_lyb
{
public partial class checkimage : system.web.ui.page
{
random ran = new random();
protected void page_load(object sender, eventargs e)
{
string str = getrandomvalidate(4);
session[check] = str;
//这一步是为了将验证码写入session,进行验证,不能缺省,也可一使用cookie
getimagevalidate(str);
}
//得到随机字符串,长度自己定义
private string getrandomvalidate(int len)
{
int num;
int tem;
string rtustr = ;
for (int i = 0; i < len; i++)
{
num = ran.next();
/*
* 这里可以选择生成字符和数字组合的验证码
*/
tem = num % 10 + 0;//生成数字
//tem = num % 26 + a;//生成字符
rtustr += convert.tochar(tem).tostring();
}
return rtustr;
}
//生成图像
private void getimagevalidate(string strvalue)
{
//string str = oo00; //前两个为字母o,后两个为数字0
int width = convert.toint32(strvalue.length * 12); //计算图像宽度
bitmap img = new bitmap(width, 23);
graphics gfc = graphics.fromimage(img); //产生graphics对象,进行画图
gfc.clear(color.white);
drawline(gfc, img);
//写验证码,需要定义font
font font = new font(arial, 12, fontstyle.bold);
system.drawing.drawing2d.lineargradientbrush brush =
new system.drawing.drawing2d.lineargradientbrush(new rectangle(0, 0, img.width, img.height), color.darkorchid, color.blue, 1.5f, true);
gfc.drawstring(strvalue, font, brush, 3, 2);
drawpoint(img);
gfc.drawrectangle(new pen(color.darkblue), 0, 0, img.width - 1, img.height - 1);
//将图像添加到页面
memorystream ms = new memorystream();
img.save(ms, system.drawing.imaging.imageformat.gif);
//更改http头
response.clearcontent();
response.contenttype = image/gif;
response.binarywrite(ms.toarray());
//dispose
gfc.dispose();
img.dispose();
response.end();
}
private void drawline(graphics gfc, bitmap img)
{
//选择画10条线,也可以增加,也可以不要线,只要随机杂点即可
for (int i = 0; i < 10; i++)
{
int x1 = ran.next(img.width);
int y1 = ran.next(img.height);
int x2 = ran.next(img.width);
int y2 = ran.next(img.height);
gfc.drawline(new pen(color.silver), x1, y1, x2, y2); //注意画笔一定要浅颜色,否则验证码看不清楚
}
}
private void drawpoint(bitmap img)
{
/*
//选择画100个点,可以根据实际情况改变
for (int i = 0; i < 100; i++)
{
int x = ran.next(img.width);
int y = ran.next(img.height);
img.setpixel(x,y,color.fromargb(ran.next()));//杂点颜色随机
}
*/
int col = ran.next();//在一次的图片中杂店颜色相同
for (int i = 0; i < 100; i++)
{
int x = ran.next(img.width);
int y = ran.next(img.height);
img.setpixel(x, y, color.fromargb(col));
}
}
}
}
在login.aspx页面中使用验证码,并实现双击更换图片功能:
<img src=checkimage.aspx
alt=看不清楚,双击图片换一张。
ondblclick=this.src= checkimage.aspxflag= + math.random()
border=1 height=24 />
日照网站建设用地区优化的要领辅佐企业在搜索引擎市场占据份额seo优化探索搜索引擎的小知识微商48种加人方法网站搭建时的一些问题分析如何自己建设网站?简单几步轻松搞定企业网站建设中的运行和优化流程ssl证书匹配多域名应该注意什么,在什么机构申请比较好营销型网站建设中,后期的优化非常关键