解决php session验证码不现实的问题

本人一开始图片老显示不出来,显示的是一个裂了的图片,经查询发现可能由以下几种可能造成

1)在header("Content-type:image/png");前加如下一段代码

ini_set('display_errors', 'Off');

本人就是由上面的问题造成。

附上生成验证码的图片的代码

<?php
	ini_set('display_errors', 'Off');
	header("Content-type:image/png");
	session_start();

	$_SESSION['code'] = 'null';			//初始化
	$width = '58';
	$height = '22';
	//$code = '';
	$tmptext ='';
	$bordercolor= '';
	for($i=0;$i<4;$i++)
	{
		$tmptext = rand(0,9);
		$code .= $tmptext;
	}
	$_SESSION['code'] = $code;

	//以下三句诗让浏览器不缓存
	@header("Expires:-1");
	@header("Cache-Control:no-store,private,posc-check=0,pre-check=0,max-age=0",FALSE);
	@header("Pragma:no-cache");

	if(function_exists('imagecreate') && function_exists('imagecolorset') && function_exists('imagecopyresized')
			&& function_exists('imagecolorallocate') && function_exists('imagesetpixel')
			&& function_exists('imagechar')  &&  function_exists('imagecreatefromgif')
			&& function_exists('imagepng')
		)
	{
		$im = imagecreate($width, $height);
		$backgroundcolor = imagecolorallocate($im, 255, 255, 255);
		$numorder = array(1,2,3,4);
		/**shuffle将数组打乱*/
		shuffle($numorder);
		/**array_flip返回一个被反转的数组,键值被处理值*/
		$numorder = array_flip($numorder);
		$x='';
		$y='';
		$text_color = '';
		for($i=1;$i<=4;$i++)
		{
			$x = $numorder[$i] * 13 + mt_rand(0,4) -2;
			$y = mt_rand(0,3);
			$text_color = imagecolorallocate($im, mt_rand(50,255), mt_rand(50,255), mt_rand(50,255));
			/**将字符画在$im图中,5表示字体的大小 $x+5 */
			imagechar($im, 5, $x+5, $y+3, $code[$numorder[$i]], $text_color);

		}

		$linenums = mt_rand(10,32);
		for($i=0;$i<=$linenums;$i++)
		{
			$linecolor = imagecolorallocate($im, 255, mt_rand(0,255), mt_rand(0,255));
			$linex = mt_rand(0,255);
			$liney = mt_rand(0,255);
			imageline($im, $linex, $liney, $linex+mt_rand(0,4)-2, $liney+mt_rand(0,4)-2,  $linecolor);
		}

		for($i=0;$i<40;$i++)
		{
			$pointcolor = imagecolorallocate($im, mt_rand(0,255), mt_rand(0,255), mt_rand(0,255));
			imagesetpixel($im, mt_rand(0,$width), mt_rand(0,$height), $pointcolor);
		}

		$bordercolor = imagecolorallocate($im, 150, 150, 150);
		imagerectangle($im, 0, 0, $width-1, $height-1, $bordercolor);

		imagepng($im);
		imagedestroy($im);
	}
?>

2)变量没初始化

3)在header("Content-type:image/png");前加入

ob_clean();

第二三中方法不确保可以解决问题,仅供参考。

时间: 2024-12-25 14:11:41

解决php session验证码不现实的问题的相关文章

网站启动SSL, http变为https后,session验证码错误解决方法

网站启动SSL, http变为https后,session验证码错误解决方法 最近公司需要后台启动安全证书,证书安装完毕后,后台老提示 验证码错误,经过几天的研究,此问题已经得到有效解决,现把方法如下. 一.问题展示 看到此问题后,我求助了伟大的互联网,网上大概的解决方法,是说要写两个session,不能相互互通,按照这个思路,我整了几天不见好,后来我重新写了一段代码,问题解决,其实根本不需要写两个session,先公布解决方法. 二.解决方法 原来的验证码代码 <script language

绕过session验证码实现批量登录注册

验证码的分类: 目前市面上验证码的主要分为两大类:session验证码.cookie验证码. 今天主要讲Session验证码.Session验证码顾名思义就是跟会话有关系,当客户端每次访问登录或者注册页面的时候,会执行一次验证码生成的操作,然后把生成的验证码保存到session的某个参数中(比如我们保存到名称为"VerificationCode"),在用户执行登录或者注册的时候,就会去session中去取VerificationCode这个参数的值,与其进行对比,如果一样,则能成功通过

Session验证码的原理

using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; namespace session验证码 { public partial class WebForm1 : System.Web.UI.Page { //我们平常在在登陆网页的时候需要输的"入验证码"的原理 p

Spring Session解决分布式Session问题的实现原理

使用Spring Session和Redis解决分布式Session跨域共享问题 上一篇介绍了如何使用spring Session和Redis解决分布式Session跨域共享问题,介绍了一个简单的案例,下边就学习一下Spring Session的实现原理. 注:以下步骤是基于XML的方式实现 Spring Session的代码讲解! 先从web.xml文件说起 我们知道Tomcat再启动的时候首先会去加载web.xml 文件,Tomcat启动的时候web.xml被加载的顺序:context-pa

如何解决设置Session保存在StateServer后引起WebService/WebMethod无法异步获取Session

项目中有一个文件上传功能,需要显示文件上传进度.于是使用PageMethods 调用WebService/WebMethod . 在demo中测试一切正常.但是转移到项目中之后无法异步刷新文件上传进度. 调试后发现原因是异步刷新时,获取的session信息不是文件上传页面更新的最新信息. 又发现 web.config 中 有如下设置 <sessionState mode="StateServer" stateConnectionString="tcpip=localho

使用Spring Session和Redis解决分布式Session跨域共享问题

前言 对于分布式使用Nginx+Tomcat实现负载均衡,最常用的均衡算法有IP_Hash.轮训.根据权重.随机等.不管对于哪一种负载均衡算法,由于Nginx对不同的请求分发到某一个Tomcat,Tomcat在运行的时候分别是不同的容器里,因此会出现session不同步或者丢失的问题. 文末分享了我一部分私人收藏 有兴趣的可以收藏看一下的 都是架构师进阶的内容 实际上实现Session共享的方案很多,其中一种常用的就是使用Tomcat.Jetty等服务器提供的Session共享功能,将Sessi

Redis实战和核心原理详解(5)使用Spring Session和Redis解决分布式Session跨域共享问题

Redis实战和核心原理详解(6)使用Spring Session和Redis解决分布式Session跨域共享问题 前言 对于分布式使用Nginx+Tomcat实现负载均衡,最常用的均衡算法有IP_Hash.轮训.根据权重.随机等.不管对于哪一种负载均衡算法,由于Nginx对不同的请求分发到某一个Tomcat,Tomcat在运行的时候分别是不同的容器里,因此会出现session不同步或者丢失的问题. 实际上实现Session共享的方案很多,其中一种常用的就是使用Tomcat.Jetty等服务器提

如何解决php 生成验证码图片不显示问题

最近遇到一个问题,就是验证码在别人的电脑上可以显示,但是我自己的电脑上去不能.原因找了好久,哈哈,终于找到了!现在给大家分享一下: 程序: <?php $w = 80; //设置图片宽和高 $h = 26; $str = Array(); //用来存储随机码 $string = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";//随机挑选其中4个字符,也可以选择更多,注意循环的时候加上,宽度适当调整 for($i = 0;$i < 4;$i++

【Nodejs项目手记】Nodejs中使用图片验证码,captchapng模块可以解决Nodejs图片验证码

Nodejs项目,在做图片验证码的时候遇到了难题.Nodejs没有图片库,以后会有,但是现在没有. 网络上搜索一圈,有几个解决方案: 1.采用第三方验证码程序,有的时候,项目可能不允许: 2.使用Java或者PHP生成图片,Nodejs调用,中间采用Redies共享: 这两种方式都不太理想,好在终于找到了可以支持Nodejs图片验证码的一个库,虽然只支持数字,但是也还不错.原理是使用Base64的图片编码方式. 这个库的Gighub地址是:https://github.com/GeorgeCha