用户登录注册之验证码技术实现
用户登录注册之验证码技术实现
对于一些恶意强暴破解密码的行为(即通过硬性尝试用户名密码进行破解),可以采用验证码对其进行抵御,对于一些程序可以识别验证码,则需要对验证码形式进行多样化设计。
注!!!!!拿到的页面是只有图片,需要用另一个页面引用图片页面示例:<img src = "xxx.jsp">用户登录时设置验证码代码实现:页面<script type="text/javascript"> function _change() {
var imgEle = document.getElementById("img");
imgEle.src =
"${pageContext.request.contextPath }/user_getVerify.actio n?a="
+ new Date().getTime();
}
</script>
<BODY>
<FORM id=form1 name=form1
action="${pageContext.request.contextPath }/user_login.a ction" method="post">
<TR>
<TD style="HEIGHT: 28px">验证码:</TD>
<TD style="HEIGHT: 28px">
<input type="text" name="verifyCode" size="1"/>
<img id="img"
src="${pageContext.request.contextPath }/user_getVerify. action">
<br/>
<a href="javascript:_change()">换
一张</a>
</TD>
<a href="#"></a>
<TD style="HEIGHT:
28px"><SPAN id=RequiredFieldValidator4
style="FONT-WEIGHT: bold; VISIBILITY: hidden; COLOR: white">请输入验证码
</SPAN></TD></TR>
<TR>
</FORM></BODY>
2.action操作//获得验证码
public void getVerify() throws IOException{
HttpServletRequest
request=ServletActionContext.getRequest();
HttpServletResponse
response=ServletActionContext.getResponse();
VerifyCode vc=new VerifyCode();
BufferedImage image=vc.getImage();//获得图片
request.getSession().setAttribute("session_vcode",vc.g etText());//将验证码内容放在域对象里面
VerifyCode.output(image,
response.getOutputStream());
}
public String login(){
HttpServletRequest
request=ServletActionContext.getRequest();
String sessionCode = (String)
request.getSession().getAttribute("session_vcode");
String paramCode =
request.getParameter("verifyCode");
if(!paramCode.equalsIgnoreCase(sessionCode)){ request.setAttribute("msg", "验证码错误!");
return "login";
}
User userExit=userService.login(user);
if(userExit!=null){
if(!userExit.isState())
{
request.setAttribute("msg", "您尚未激活,请到邮箱"+userExit.getEmail()+"激活!");
return "loginerror";
}
request=ServletActionContext.getRequest();
request.getSession().setAttribute("user", userExit);
return "loginsuccess";
}else{
return "login";
}
}
3.验证码代码实现import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Random;
import javax.imageio.ImageIO;
public class VerifyCode {
private int w = 70;
private int h = 35;
private Random r = new Random();
// {"宋体", "华文楷体", "黑体", "华文新魏", "华文隶书", "微软雅黑", "楷体_GB2312"}
private String[] fontNames = {"宋体", "华文楷体", "黑体", "微软雅黑", "楷体_GB2312"};
// 可选字符
private String codes =
"23456789abcdefghjkmnopqrstuvwxyzABCDEFGHJKMN PQRSTUVWXYZ";
// 背景色
private Color bgColor = new Color(255, 255, 255);
// 验证码上的文本
private String text ;
// 生成随机的颜色
private Color randomColor () {
int red = r.nextInt(150);
int green = r.nextInt(150);
int blue = r.nextInt(150);
return new Color(red, green, blue);
}
// 生成随机的字体
private Font randomFont () {
int index = r.nextInt(fontNames.length);
String fontName = fontNames[index];//生成随机的字体名称
int style = r.nextInt(4);//生成随机的样式, 0(无样式), 1(粗体), 2(斜体), 3(粗体+斜体)
int size = r.nextInt(5) + 24; //生成随机字号, 24 ~ 28
return new Font(fontName, style, size);
}
// 画干扰线
private void drawLine (BufferedImage image) { int num = 3;//一共画3条
Graphics2D g2 = (Graphics2D)image.getGraphics();
for(int i = 0; i < num; i++) {//生成两个点的坐标,即4个值
int x1 = r.nextInt(w);
int y1 = r.nextInt(h);
int x2 = r.nextInt(w);
int y2 = r.nextInt(h);
g2.setStroke(new BasicStroke(1.5F));
g2.setColor(Color.BLUE); //干扰线是蓝色
g2.drawLine(x1, y1, x2, y2);//画线
}
}
// 随机生成一个字符
private char randomChar () {
int index = r.nextInt(codes.length());
return codes.charAt(index);
}
// 创建BufferedImage
private BufferedImage createImage () {
BufferedImage image = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
Graphics2D g2 = (Graphics2D)image.getGraphics();
g2.setColor(this.bgColor);
g2.fillRect(0, 0, w, h);
return image;
}
// 调用这个方法得到验证码
public BufferedImage getImage () {
BufferedImage image = createImage();//创建图片缓冲区
Graphics2D g2 =
(Graphics2D)image.getGraphics();//得到绘制环境
StringBuilder sb = new StringBuilder();//用来装载生成的验证码文本
// 向图片中画4个字符
for(int i = 0; i < 4; i++) {//循环四次,每次生成一个字符
String s = randomChar() + "";//随机生成一个字母
sb.append(s); //把字母添加到sb中
float x = i * 1.0F * w / 4; //设置当前字符的x轴坐标
g2.setFont(randomFont()); //设置随机字体
g2.setColor(randomColor()); //设置随机颜色
g2.drawString(s, x, h-5); //画图
}
this.text = sb.toString(); //把生成的字符串赋给了this.text
drawLine(image); //添加干扰线
return image;
}
// 返回验证码图片上的文本
public String getText () {
return text;
}
// 保存图片到指定的输出流
public static void output (BufferedImage image, OutputStream out)
throws IOException {
ImageIO.write(image, "JPEG", out);
}
}4.效果
图形验证码的破解与设计
图形验证码的破解与设计 图形验证码设计目的是利用人脑的不可模拟性来防止机器自动识别.但是一个设计低级的图形 验证码(可以被快速破解)除了增加网络流量以外没有任何意义.网上太多的”生成验证码”的教程把 重点放在如何生成图片上,而实用性却几乎为零.生成图形本身是零基础技能,任何平台都提供内存 图形环境和设备上下文(DC)让你操作,vc中的CDC,java/.NET中的Graphics,都提供比你需要的还要 多的绘图API.可以说介绍这些东西根本没有必要.(竟然还在某些地方看到图形叠加叫做水印的,图 片水印是指可分离的但合成后不可视的图形透明通道,用于象电子印章之类的加密验证技术).设计 一个复杂的难以破解的图形验证码需要了解 常规的可以破解图形验证码的技术种类. 利用session生存期来凭肉眼设别一次后无限次使用同一图形验证码并不算图形验证码的破解.这只是没有经验的程序员设计上的逻辑BUG.即图形验证码的session存活期是全局的.而不是针对某次验证过程的.具体过程如下: 客户端请求一个图形验证码.服务器生成一个图形验证码并将验证码的内容放在session中.当 客户端凭肉眼识别通过输入框提交验证码内容后,服务端和session中的内容比较通过.用户其它信 息校验成功后成功登录.但这时验证码的session还没有过期,客户端用相同的内容还可以为另一次 验证使用.所以每个验证过的验证码的session应该立即销毁.这种逻辑上的BUG可以被没有任何技术经验的人所破解.真正的对图形识别码进行破解,大多数是对验证码进行切割比对.假设图形验证码 生成的图片上数字是1234 一.切割:首先利用一定算法可以将其切割成最小的四张图片.将四周的空白最大可能地去除. 二.退色:将彩色图片退色成黑白的.用两极法,在0-255中小于128的视为黑色,128到255视为白色. 三.去躁点,将连续黑色范围小于某值,比如小于最小笔划中点的区域做成白色. 四.再进行最小切割. 五.比对,利用已经做好的图形库进行象素比对.因为经过上面的处理,图象都成了黑白两色,以 尺寸最匹配的图片进行比对.先拿图形库中干净的标本图片和没有去躁点的目标比对,看标本图片中每个黑色象素在目标中是否存在,如果都存在比对通过.目标图片中的黑点在标本图片中没有的应该为躁点.然后拿去躁后的目标图片的黑色象素去标本图片比对,看是标本图片中是否存在,如果都存 在为通过.有可能去躁不切底,这个过程只能作为参考,通过则为充分条件,不通过不是必要否决条件.从上面比对过程我们可以看出.比对的最重要的一步是切割,如何能保证目标图片被成功要割成已有标本图的大小匹配是最关键的技术.如果你的图片内容生成时本身就是按规则生存有,比如drawString时把一行内容串完整地画出来.那么间隔都是固定的,字符大小也是固定的.即使每次只 画一个字,每个字意隔不同,但只要按最小切割,也就是把所有的行列中没有有效点的空白去切去,再以一套按最小切割的标本图来比较就很容易了.字体大小和样式(斜体,下划线,加粗),体型(黑体,宋体)的变化对增加难度不大,只要按不同字号和式样以及体型多备几套标本库,当然变化越多比对出 错可能性越大,但从字体大小和式样上变化不是根本手段.如果你的验证码本身只有黑白两色那真正是让破解者太感谢了.复杂的颜色可以让其在退色过程中增加出错几率.长条形类似笔画的躁点,在 比对时并不起多大作用,因为可以以标本图的象素去找目标图对应象素,躁点就是多余出来的.但长 条形类型笔画的躁点加上不规则间隔对切割起到了巨大的阻碍作用.最最关键的要点是重叠技术. 两个字之间的部份重叠对于肉眼识别基本上没有障碍,但对于依赖切割比对的机器而言却是致 命的克星.所以保证你的验证码内容中有一些文字内容部份的重叠.如果字数较长,比如8位,其中有 两至三处的重叠,那么基本破解程序就死掉了.有些高级的破解程序利用色差切割,两个字的相交处 的不同颜色来作为切割界限,在这里可以将重叠的字设同色.增加切割难度. 只要无法切割,那么其它方法就无计可施.所以设计一个难以切割的验证码是保证不被破解的最有力的保证.文字内容只增加比对时间而已,你用18030个中文字符和用10个数字,比对过程可能会增加1000多倍,对于机器比对而言难度不大,但很大地加强了标本图库的制作的难度. 下面是我用c#做的一个简单例子.复杂的设计用简单来说明,其实抓住最关键的地方就是至少保证有一次重叠,因为只是例子.真正实用的时候我会做出三次以上重叠.我用不同字号来何证间隔的 不规则性.将原始阿位佰数字和转换后的数字都保存起来,用户可以根据图片内容只输入阿位佰数字或图片上的内容都可以.注意如果输入的内容中有不好输入的字应该提供一个软键盘之类的输入界
ui用户界面设计课程设计报告
UI用户界面设计 大作业课程设计报告 题目:依依旅行系统前台应用及后台管理院别:信息与控制学院 专业:计算机科学与技术 学生姓名: 7宋依依 指导教师:孙丽云 成绩: 2015年 6 月 12 日 一、系统概述 1.1课程设计题目: 依依旅行系统前台及后台管理 1.2 课程设计运行环境: Java,MyEclipse6.5,Tomcat5.x Microsoft SQL Server 2008 360安全浏览器7.1 1.3 课程设计实现技术: 基于HTML,CSS,JSP等技术的应用 二、依依旅行系统需求分析 2.1系统功能需求:
系统的功能需求包括一下几个方面 (1)游客在不登录的情况下只可以进行相关旅行,车票,酒店信息的查询。(2)游客通过注册登录或者登录后,可以通过网络查询景点的信息概况和预定景点票,酒店,车票(飞机票,火车票,或者租车)。 (3)游客登录后还可以进行各种订单的退订,个人信息的修改。 (4)系统管理员可以查看游客的预定请求和取消预定的请求。 (5)系统管理员可以对系统的数据库进行维护,例如增加、删除和修改景点信息,增加、删除工作人员帐户,增加和删除旅行用户。 三、依依旅行系统概要分析 3.1旅游系统模块介绍 满足以上需求的管理系统主要包括以下几个模块。 (1)旅游数据维护模块 基本数据维护模块提供了使用者录入、修改并维护基本数据的途径。例如对游客及导游及工作人员各项信息的更新和修改。 (2)旅游业务模块 基本业务模块主要用于实现游客查询景点信息和预定的管理,可以登陆系统预定景点游票和导游预定,工作人员可以处理预定信息和取消预定信息等操作。 (3)数据库管理模块 在系统中,所有景点信息以及工作人员和导游的帐户信息都要进行统一管理,景点的使用情况和预定情况也要进行详细的记录,要用统一的数据库平台进行管理。 (4)旅游信息查询模块 信息查询模块主要用于查询景点的信息和游客的预定信息。 下图所示表示了旅游开发管理系统的功能需求: 3.2旅游数据维护模块 数据维护模块包括如下图所示的几个方面: (1)修改更新景点信息:系统管理员可以更新和修改景点信息。 (2)更新和修改信息:系统管理员可以更新和修改旅游景点和酒店出行,删除游客的信息。 (3)添加景点信息:系统管理员可以添加景点及景点信息。 (4)删除景点信息:系统管理员可以删除景点及景点信息。 3.3旅游业务模块 旅游业务模块包括一下几个方面: (1)注册登陆后,更改个人信息 (2)查询信息:游客查询景点使用信息及景点概括信息。 (3)预定取消景点:游客预定景点票。 (4)酒店预订:游客可一根据情况预定酒店。 (5)出行方式:游客可以根据自己的情况选择出行方式。 3.4数据库管理模块 数据库模块包括一下一个方面: (1)游客信息管理:信息包括游客的姓名,电话号码,及联系方式等。(2)景点信息管理:景点信息包括景点的名称,代号,概况等。
APP注册登录功能设计全方位解析
注册登录功能设计全方位解析 用户注册功能对于一个的重要性毋庸置疑,然而注册功能又是公认的在设计中坑最多的功能,能够设计好注册功能是一个优秀项目经理的基本功。 那么,在设计注册功能过程中,你有没有纠结于这些问题呢: 1.邮箱注册、手机号注册、第三方账户注册,这么多方式应该选择哪种? 2.是应该先让用户注册还是先让用户使用?先让用户使用的话,应该在怎样的时机 注册? 3.怎样的注册流程用户体验最好? 4.一些细节问题:要不要加图片验证码?要不要让用户手动勾选用户协议?要不要 让用户设置头像?… … 这次我们来好好捋一捋注册登录设计过程中的遇到的那些问题吧。 注册登录功能的价值 首先我们来分析注册、登录功能的价值在哪里。换个角度说,为该产品设计注册登录功能的目的何在?对于每个产品来说,只有把握好产品的设计目标,才能找到适合该产品的设计思路。 我们从三个层面来分析: 用户层面
1.用户需要在产品中获得一个独立的,以体现其个性化的存在。 2.用户需要产品为其记录使用进度、状态、收藏的内容。 3.用户希望获得其它用户的真实信息或更详尽的信息。 4.用户希望产品通过对自己更详尽的了解提供更好的服务。比如大姨吗。 功能层面 1.便于跨设备同步数据,也便于在同一设备中切换不同的账户并保留账户之前的状 态。 2.有社交功能的产品必须注册账号以编写自己的的内容,同时便于其它用户辨识。 3.有交易功能的产品,为个人账户记录订单等交易信息,同时提高交易的安全性。 4.有应用内付费、会员增值功能的产品,注册登录可以确保用户权益。 业务层面 1.需要采集对于核心业务非常重要的用户信息,比如手机号、真实姓名等信息。 2.注册登录后便于采集推进运营的数据,以指导产品运营方向。 3.用户激励:通过注册得到手机号、邮箱账户后,一些产品通过给用户发短信或优 惠券(送优惠券、活动推荐)吸引用户,提高活跃度。 4.消费转化:某些产品得到手机号后,会利用电话营销的方式向客户推介其付费服 务。比如。 综上,在设计功能之前,产品经理应该弄清楚你的产品目标属于以上哪些,注册账户功能的重要性怎样,哪些核心功能与其相关联。 注册登录方式的分类
验证码识别常用算法
验证码识别常用算法 图像处理(验证码识别)程序中常用算法:灰度,二值化,去噪(1*1像素或者3*3像素等) 代码: view plaincopy to clipboardprint? //灰度 private void btnGray_Click(object sender, EventArgs e) { try { int Height = this.picBase.Image.Height; int Width = this.picBase.Image.Width; Bitmap newbitmap = new Bitmap(Width, Height); Bitmap oldbitmap = (Bitmap)this.picBase.Image; Color pixel; for (int x = 0; x < Width; x++) { for (int y = 0; y < Height; y++) { pixel = oldbitmap.GetPixel(x, y); newbitmap.SetPixel(x, y, Gray(pixel)); } } this.picBase.Image = newbitmap; } catch (Exception err) { MessageBox.Show("灰度化失败原因:" + err.Message); } } //灰度化算法 protected static Color Gray(Color c) { int rgb = Convert.ToInt32((double)(((0.3 * c.R) + (0.59 * c.G)) + (0.11 * c.B))); return Color.FromArgb(rgb, rgb, rgb); } //灰度 private void btnGray_Click(object sender, EventArgs e) { try { int Height = this.picBase.Image.Height; int Width = this.picBase.Image.Width; Bitmap newbitmap = new Bitmap(Width, Height); Bitmap oldbitmap = (Bitmap)this.picBase.Image; Color pixel; for (int x = 0; x < Width; x++) { for (int y = 0; y < Height; y++) { pixel = oldbitmap.GetPixel(x, y);
用户管理模块设计
用户管理模块设计 用户管理模块提供对用户信息的管理,包括用户注册、用户登录、用户权限管理、用户信息修改以及用户等级修改。 1、用户注册 根据用户表,设计相应的注册页面,注册页面包括用户名、密码、邮箱、部门、电话等信息,当用户进行注册时,填写这些信息,用户名是不能与已注册的用户名相同,填写完成后,提交注册请求,后台相应的Action会响应该动作,首先获取到页面发来的参数,然后将这些参数通过Session对象写入到数据库中,最后向用户提示注册成功与否。 2、用户登录 用户注册之后,就可以通过账户和密码登陆至平台。当用户提交登陆请求,后台相应的Action会响应该动作,首先获取到页面发来的用户名和密码,然后通过Query对象查询该用户是否存在且密码正确,最后将根据结果给用户发送跳转页面,如果用户存在且密码正确,则可进入平台主页面,否则,提示登陆错误信息。 3、用户权限管理 用户权限管理将用户分为普通用户和管理员,他们具有不同的权限,他们各自的权限如表1所示。此平台首次使用时,会内置一个超级管理员,有修改用户等级的权限。 表1不同用户权限授权
定义一个权限拦截器,它的功能是用来检验用户类型,对每一个需要管理权限的操作均进行拦截,同时检验用户类型,判断该用户类型是否可执行该操作,即可达到权限管理的作用。如果某操作在当前用户等级对应的操作范围内,则可正常访问,否则跳转到提示页面,提示用户权限不足。 4、用户信息修改 用户管理模块提供用户修改自己信息的功能。当进入信息修改界面,首先会获取Session中当前用户信息,供用户在当前信息基础上进行信息修改。当用户填写完修改信息,并发送修改请求后,后台将响应用户的请求,首先得到所有用户修改参数,然后将修改的信息设置到该对象中,最后更新数据库,将更新结果发送给用户。
用户界面设计说明书样本
用户界面设计说明 书
[键入公司名称] [键入文档标题] [键入文档副标题] [键入作者姓名] 2012/11/27
修订历史记录
目录 1 引言................................................... - 3 - 1.1编写目的............................................ - 3 - 1.2项目背景............................................ - 4 - 1.3定义、缩略词........................................ - 4 - 1.4参考资料............................................ - 5 - 2 应当遵循的界面设计规范 ................................. - 5 - 2.1用户界面设计原则.................................... - 5 - 2.2界面一致性.......................................... - 5 - 2.3布局合理化原则.......................... 错误!未定义书签。 3 界面的关系图和工作流程图 ............................... - 7 - 4 主界面................................................ - 10 - 4.1主界面............................................. - 10 - 4.2子界面A ........................................... - 11 - 4.3子界面B ........................................... - 12 - 4.4子界面C ........................................... - 13 - 4.5子界面D ........................................... - 14 - 4.6子界面E ........................................... - 15 - 4.7子界面F ........................................... - 16 - 5 美学设计.............................................. - 17 -
实训四__设计用户系统的注册及登录
实训四设计用户系统的注册及登录 一、实训目的 1.能正确设计用户注册程序。 2.能正确设计用户登录程序。 3.能正确设计用户的管理程序。 二、工作任务 任务1:将静态注册页面转换成动态ASP文件页面,设置表单对象。 任务2:为网页设置引用文件。 任务3:为注册页面编程,实现对填写的注册信息进行判断的功能,并将注册信息写入数据库。 任务4:为登录页面编程,实现登录功能,并出现欢迎用户登录的界面。 三、实训步骤 (一)编程实现用户注册功能 首先创建注册界面 图1注册界面 任务1操作方法: 1)用dreamweaver打开前面我们所创建的动态网站,将项目三中所设计的静态注册页面reguser.html复制一份并改名为reguser.asp,其中注册部分页面如图2如所。
图2注册界面 3)选择标签