关于验证码无法加载或者验证码错误问题?

浏览:3961 发布日期:2014/12/10 分类:技术分享 关键字: 验证码 session GD库
最近LZ在做onethink时候遇到这样两个问题:
1 验证码无法加载.
2 加载成功后一直提示验证错误.

先说说LZ服务器环境:
系统:ubuntu12.04
web服务器:nginx/1.1.19
TP版本:3.2.3beta
mysql版本:5.5.38-0ubuntu0.12.04.1
先来说说第一个问题,LZ通过对获取验证码http请求包抓取发现,在获取验证发的时候生成验证码类报错了,提示是129行,逐LZ找到对应代码一看,发现是这段代码报的错:$this->_image = imagecreate($this->imageW, $this->imageH); 我相信有写开发经验的童鞋都知道是什么意思。就是在绘制画布的时候报错了,显然这是缺少了某个类库的支持,因为LZ接触PHP才不到2个月,不知道在PHP里面说画布有没有童鞋理解。接下来LZ百度了一下好多人的回答是缺少GD库,OK 楼主安装说法在ubuntu安装上了GD库,ubuntu安装GD库最快的方法是apt-get install gd 就完事,验证码出来。
接下来开始提交验证码,怎么输入都是提示错误,OK 楼主开始一一去找原因 最后找到验证码类-Verify 发现在加密验证码的时候 session的key值是通过加密方式加密的 验证码的值也是加密过后对比的,之前看到有童鞋用session('verify_code')方式去取值。那我只能告诉你是取不到值的,因为tp在存储验证码session的时候是存储的一个数组,包含verify_code—验证码、verify_time—存储时间。所以取验证码值应该是session(加密密文后的值)。但是还是不对,LZ这是突然想到php开启session都有一个temp目录 去查看了一下那个目录是空,那不用说肯定是没有写如session文件进去或者就是没权限。我相信到这里大多童鞋都知道是怎么回事了吧。

总结:出现上面2个问题原因
1 GD库没有正确加载
2 session文件没有写入权限或者是配置不正确。

补充:还有童鞋说是bom问题 再此我也说下,可能好多童鞋可能不知道BOM 是什么,在此我也说明下。
BOM:
为了识别 Unicode 文件,Microsoft 建议所有的 Unicode 文件应该以 ZERO WIDTH NOBREAK SPACE(U+FEFF)字符开头。这作为一个“特征符”或“字节顺序标记(byte-order mark,BOM)”来识别文件中使用的编码和字节顺序。

Linux/UNIX 并没有使用 BOM,因为它会破坏现有的 ASCII 文件的语法约定。 (-- 这就是导致这次页面出现空白行的原因)

dom不是好东西就是一个数据签名,一串字符串而已,经常导致页面出现空白行,特别是PHP进行文件引入require_once和include的时候

说到这里大家应该清楚了吧。

出现BOM 解决代码:
<?php
if (isset($_GET['dir'])){
$basedir=$_GET['dir'];
}else{
$basedir = '.';
}
$auto = 1;
checkdir($basedir);
function checkdir($basedir){
if ($dh = opendir($basedir)) {
while (($file = readdir($dh)) !== false) {
if ($file != '.' && $file != '..'){
if (!is_dir($basedir."/".$file)) {
echo "filename: $basedir/$file ".checkBOM("$basedir/$file")." <br>";
}else{
$dirname = $basedir."/".$file;
checkdir($dirname);
}
}
}
closedir($dh);
}
}
function checkBOM ($filename) {
global $auto;
$contents = file_get_contents($filename);
$charset[1] = substr($contents, 0, 1);
$charset[2] = substr($contents, 1, 1);
$charset[3] = substr($contents, 2, 1);
if (ord($charset[1]) == 239 && ord($charset[2]) == 187 && ord($charset[3]) == 191) {
if ($auto == 1) {
$rest = substr($contents, 3);
rewrite ($filename, $rest);
return ("<font color=red>BOM found, automatically removed._<a href=http://www.hengidc.com>http://www.hengidc.com</a></font>");
} else {
return ("<font color=red>BOM found.</font>");
}
}
else return ("BOM Not Found.");
}
function rewrite ($filename, $data) {
$filenum = fopen($filename, "w");
flock($filenum, LOCK_EX);
fwrite($filenum, $data);
fclose($filenum);
}
?>
复制到站点根目录运行即可,用完切记删除,不然后果自负。
如果有童鞋出现相同的问题 欢迎贴上来大家一起讨论
最佳答案
评论( 相关
后面还有条评论,点击查看>>