今天改程序,无意中在discuz的注册页面停留了一下,看到他那个验证码,我忽然想到前段时间一个论坛开起了验证码,仍然被spam疯狂注册,一个月被注册了2000多个帐号!
应该说这个验证码已经挺复杂的,主要是字体比较奇怪,如果找不到字体,用简单的模式匹配解码很难。
discuz的验证码只有四位数字,用穷举的方式暴力破解,最多只需要10000次(0000-9999)就可以找到正确的验证码。
问题在于discuz能不能使用暴力破解,于是要自己研究一下。
验证码实现验证的原理是这样的(明白人可以跳过):后台产生一个随机数,存放于服务器session,然后生成一个图片丢给客户端,同时给客户端一个sessionID。客户端输入一个验证码,提交到服务器的验证脚本,脚本根据sessionID去取session,跟提交上来的验证码比较,就可以获得结果。
discuz的注册系统是用ajax实现实时验证的,很方便使用,这也方便了我作测试,输入一个验证码马上会自动发送判断请求,点一下验证码的图片马上会换一个验证码。也因为方便,产生了很大的问题!
暴力破解的原理是:
1.如果程序不是在每次验证之后产生新的验证码的话,hacker就可以不断提交验证码去碰
2.如果服务器每次都更换新的验证码,可以在本地提供一个固定数字,不断向服务器提交验证请求,直到跟本地验证码一致,概率应该是一样的,