验证码的设计分析

在工作过程中,接手一个项目,项目的登录验证码部分是使用js写的,由js随机生成一个字符串当作验证码。我觉得这样做其实是不合理的。

验证码是,用来区分对方到底是人还是计算机程序而设计的一种验证措施。主要用于阻止垃圾信息,保护网站注册,在线投票系统刷票等等。因此验证码的实质是:用于区分行为方到底是人还是程序。

如果使用js来生成验证码,那么生成方法会暴露给所有人,这不是最主要的。

js生成验证的过程大概是:随机生成一个字符串(当然,在现实的时候,可能会加入css控制其外观,使其眼花缭乱)保存到一个全局变量,当用户提交表单的时候,js会验证用户输入的验证码部分是否和全局变量中保存的字符串相等,如果相等,则将表单”剩余”部分提交给服务器。

问题就在这里,提交表单的时候,并没有提交验证码部分,服务器端根本不关心验证码部分,如果有黑客想写程序进攻系统,在提交表单时,将除验证码之外的“剩余”部分提交给服务器,则完全绕过了验证码。那么,验证码就成了一个“自欺欺人”的,只为了表现给用户看,实际没有作用的废物。



在验证用户输入的验证码时,使用的方法:


这种设计,对计算机程序,完全没有作用。下面我将演示一下为何对程序没有作用。

我们写一段Java程序,使用HttpClient来发送http请求,提交表单:

这里,我们先使用get方法请求一下登录页面:


在控制台打印出的是;

<html>
	<head>		
		<title>运营安全服务</title>
		<link href="/twm-manager/css/login.css" rel="stylesheet" type="text/css" />
		<script type="text/javascript" src="/twm-manager/js/jquery-1.4.2.js"></script>
		<script type="text/javascript">
		 
		//验证码刷新
		function newImg() {
			$("#authImg").src="/twm-manager/validCode?time="+new Date();
		}
		
		function init(){
			document.getElementById("userName").focus();
			if("null" == "null" || "null" == ""){
				$("#msg_tr").hide();
			}else{
				$("#msg_tr").show();
				$("#showErrorMsg").html("null");
			}
			createCode();
		}	
		
		
		var objectPath = "/twm-manager";
		
		var code ; //在全局 定义验证码
		function createCode(){ 
		
			code="";
			var codes =  new Array(4);//验证码的长度
			var checkCode = document.getElementById("divCode");
			var selectChar = new Array(2,3,4,5,6,7,8,9,'a','b',
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值