在工作过程中,接手一个项目,项目的登录验证码部分是使用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',