您的位置首页生活百科

php CodeIgniter 实战教程:[1]安全验证码

php CodeIgniter 实战教程:[1]安全验证码

的有关信息介绍如下:

php CodeIgniter 实战教程:[1]安全验证码

CodeIgniter简称CI是最流行的一个php MVC框架之一,本人讲从实际项目使用中写系列实战经验,有别与其他的理论讲解文章,会附上实战流程和代码。

第一篇为大多数项目使用到的安全验证码,例如用户登录、注册、留言板、意见反馈、论坛防灌水等地方都会用到。

文章将默认你已经配置好php开发环境(本人使用的是XAMPP)和CodeIgniter基础项目了,采用MVC三个部分分开讲解。

M(Model)单纯验证码功能不需要用到Model,为了实例完整性这里给出一个对应名称的代码(可以复制到编辑器格式化)addsitemodel.php:

class Addsitemodel extends CI_Model {

function __construct() {

parent::__construct ();

$this->load->database ();

}

}

?>

C(Controller) 有三个方法,1.显示界面,如登录界面。2.获取验证码或看不清重新获取验证码。3.提交表单后验证填入的验证码是否正确。

下面为详细代码,关键地方有详细注释说明addsite.php:

class Addsite extends CI_Controller {

function __construct(){

parent::__construct();

}

function index(){

$this->load->model('addsitemodel');

$this->load->helper('url');

$this->load->view('addsiteview',$data);

}

function rand_create(){

session_start();

//生成验证码图片

header("Content-type: image/png");

//要显示的字符,可自己进行增删

$str = "1,2,3,4,5,6,7,8,9,a,b,c,d,e,f,g,h,i,j,k,m,n,p,q,r,s,t,y,z";

$list = explode(",", $str);

$cmax = count($list) - 1;

$verifyCode = '';

for ( $i=0; $i < 5; $i++ ){

$randnum = mt_rand(0, $cmax);

//取出字符,组合成验证码字符

$verifyCode .= $list[$randnum];

}

//避免程序读取session字符串破解,生成的验证码用MD5加密一下再放入session,提交的验证码md5以后和seesion存储的md5进行对比

//直接md5还不行,别人反向md5后提交还是可以的,再加个特定混淆码再md5强度才比较高,总长度在14位以上

//网上有反向md5的 Rainbow Table,64GB的量几分钟内就可以搞定14位以内大小写字母、数字、特殊字符的任意排列组合的MD5反向

//但这种方法不能避免直接分析图片上的文字进行破解,生成gif动画比较难分析出来

//加入前缀、后缀字符,prestr endstr 为自定义字符,将最终字符放入SESSION中

$_SESSION['randcode'] = md5("prestr".$verifyCode."endstr");

//生成图片

$im = imagecreate(58,28);

//此条及以下三条为设置的颜色

$black = imagecolorallocate($im, 0,0,0);

$white = imagecolorallocate($im, 255,255,255);

$gray = imagecolorallocate($im, 200,200,200);

$red = imagecolorallocate($im, 255, 0, 0);

//给图片填充颜色

imagefill($im,0,0,$white);

//将验证码写入到图片中

imagestring($im, 5, 10, 8, $verifyCode, $black);

//加入干扰象素

for($i=0;$i<50;$i++)

{

$randcolor = ImageColorallocate($im,rand(0,255),rand(0,255),rand(0,255));

imagesetpixel($im, rand()%70 , rand()%30 , $randcolor);

}

imagepng($im);

imagedestroy($im);

}

function add(){

$this->load->model('addsitemodel');

$this->load->helper('url');

session_start();

$randcode = md5("prestr".$this->input->post('randcode')."endstr");//prestr endstr 要对应上面放入session的字符串

if($randcode != $_SESSION['randcode']){

$data['result'] = "对不起,验证码输入错误,请重试!";

$this->load->view('addsite_result_view',$data);

return;

}

//其他业务逻辑代码

}

}

V(view) 有两个界面:1.显示界面addsiteview.php,2.验证失败界面addsite_result_view.php。

这里先说明显示界面,在实战中发现如果默认在界面中用php调用生成验证码的方法会导致浏览器后退的时候验证码仍然是旧的,这样就不能很好起到防灌水作用,所以采用页面加载后用js调用的方式读取验证码。需要加入jquery脚本库,其他脚本库改下初始化加载方法就可以了。

下面为详细代码,关键地方有详细注释说明addsiteview.php:

//由于尝试多次百度经验编辑器无法正常输入html相关标签 换成图片形式的,有需要文本的可以联系本人。

V(view) 验证失败界面addsite_result_view.php:

验证码输入错误

默认你已经配置好php开发环境和CodeIgniter基础项目

php环境要开通GD库支持,widow环境和XAMPP一般默认开通了

需要加入jquery脚本库,其他脚本库改下初始化加载方法就可以了