切换风格

Wizard Sky California Sunset glow Black Cloud Beige Dragon Lavender NewYear City Snow Flowers London
收藏本站XSS平台字符串转换jsfuck
PHP验证码[复制链接]
发表于 2014-8-20 16:10:08 | 显示全部楼层 |!read_mode!
有两个页面,一个index.php登陆页面带图片验证,另一个che.php是生成验证码的php页面,怎么在index.php中获取生成验证码的值用来判断验证码输入正确?
index.php代码:
<?php
session_start();
if($_POST[check]){
	if($_POST[check]==$_SESSION[check_pic]){
		echo "ok";
	}
}
?>
<form action="" method="POST">
<img src="che.php"></br>
<input type="text" name="check" ></bar>
<input type="submit" value="check" >
</form>


che.php的代码:
<?php
    //文件头... 
    session_start();
    header("Content-type: image/png"); 
    //创建真彩色白纸 

    $im = @imagecreatetruecolor(50, 20) or die("建立图像失败"); 
    //获取背景颜色 
    $background_color = imagecolorallocate($im, 255, 255, 255); 
    //填充背景颜色(这个东西类似油桶) 
    imagefill($im,0,0,$background_color); 
    //获取边框颜色 
    $border_color = imagecolorallocate($im,200,200,200); 
    //画矩形,边框颜色200,200,200 
    imagerectangle($im,0,0,49,19,$border_color); 

     $_SESSION[check_pic]="怎么获取????";
    //逐行炫耀背景,全屏用1或0 
    for($i=2;$i<18;$i++){ 
        //获取随机淡色         
        $line_color = imagecolorallocate($im,rand(200,255),rand(200,255),rand(200,255)); 
        //画线 
        imageline($im,2,$i,47,$i,$line_color); 
    } 

    //设置字体大小 
    $font_size=12; 

    //设置印上去的文字 
    $Str[0] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; 
    $Str[1] = "abcdefghijklmnopqrstuvwxyz"; 
    $Str[2] = "01234567891234567890123456"; 

    //获取第1个随机文字 
    $imstr[0]["s"] = $Str[rand(0,2)][rand(0,25)]; 
    $imstr[0]["x"] = rand(2,5); 
    $imstr[0]["y"] = rand(1,4); 

    //获取第2个随机文字 
    $imstr[1]["s"] = $Str[rand(0,2)][rand(0,25)]; 
    $imstr[1]["x"] = $imstr[0]["x"]+$font_size-1+rand(0,1); 
    $imstr[1]["y"] = rand(1,3); 

    //获取第3个随机文字 
    $imstr[2]["s"] = $Str[rand(0,2)][rand(0,25)]; 
    $imstr[2]["x"] = $imstr[1]["x"]+$font_size-1+rand(0,1); 
    $imstr[2]["y"] = rand(1,4); 

    //获取第4个随机文字 
    $imstr[3]["s"] = $Str[rand(0,2)][rand(0,25)]; 
    $imstr[3]["x"] = $imstr[2]["x"]+$font_size-1+rand(0,1); 
    $imstr[3]["y"] = rand(1,3); 

    //写入随机字串 
    for($i=0;$i<4;$i++){ 
        //获取随机较深颜色 
        $text_color = imagecolorallocate($im,rand(50,180),rand(50,180),rand(50,180)); 
        //画文字 
        imagechar($im,$font_size,$imstr[$i]["x"],$imstr[$i]["y"],$imstr[$i]["s"],$text_color); 
    } 

    //显示图片 
    imagepng($im); 
    //销毁图片 
    imagedestroy($im); 
/>



发表于 2014-8-20 22:45:53 | 显示全部楼层
看一下这个http://blog.csdn.net/rongyongfeikai2/article/details/8769526
这种一般是简单的验证,如果是生产环境不建议这样;
可以参考下discuz x2 的验证码生成和验证逻辑
截取个判断验证码的关键函数,你大概理解下,想要写安全高效的验证码还需要细看完整的代码逻辑:
function check_seccode($value, $idhash) {
	global $_G;
	if(!$_G['setting']['seccodestatus']) {
		return true;
	}
	if(!isset($_G['cookie']['seccode'.$idhash])) {
		return false;
	}
	list($checkvalue, $checktime, $checkidhash, $checkformhash) = explode("\t", authcode($_G['cookie']['seccode'.$idhash], 'DECODE', $_G['config']['security']['authkey']));
	return $checkvalue == strtoupper($value) && TIMESTAMP - 180 > $checktime && $checkidhash == $idhash && FORMHASH == $checkformhash;
}

function check_secqaa($value, $idhash) {
	global $_G;
	if(!$_G['setting']['secqaa']) {
		return true;
	}
	if(!isset($_G['cookie']['secqaa'.$idhash])) {
		return false;
	}
	loadcache('secqaa');
	list($checkvalue, $checktime, $checkidhash, $checkformhash) = explode("\t", authcode($_G['cookie']['secqaa'.$idhash], 'DECODE', $_G['config']['security']['authkey']));
	return $checkvalue == md5($value) && TIMESTAMP - 180 > $checktime && $checkidhash == $idhash && FORMHASH == $checkformhash;
}




操千曲而后晓声,观千剑而后识器。
发表于 2014-8-22 16:53:53 | 显示全部楼层
楼上解释很详细。
发表于 2014-9-6 15:47:02 | 显示全部楼层
楼上解释很详细.
发表于 2014-9-8 14:44:49 | 显示全部楼层
不错不错 学习了
发表于 2014-9-12 18:43:18 | 显示全部楼层
“酱油党”不可浏览主题与回复内容,我擦擦擦擦擦
已有 1 人评分金币 收起 理由
店小二01 -1 无意义的回复

总评分: 金币 -1   查看全部评分

发表于 2014-11-5 21:46:29 | 显示全部楼层
很详细,谢谢分享
发表于 2015-3-19 01:22:36 | 显示全部楼层

发表于 2015-3-19 01:23:05 | 显示全部楼层
看不到主題內容?!
发表于 2015-3-27 16:11:42 | 显示全部楼层

代码区

GMT+8, 2019-9-24 02:01

Powered by Discuz! X2

© 2001-2018 Comsenz Inc.

回顶部