当前位置:首页 > 行业动态 > 正文

为什么在将Dedecms 5.6/5.7系统转移到新的data目录后,网站的验证码无法显示?

在Dedecms 5.6/5.7系统转移data目录后,验证码不显示的问题通常是由于文件权限或路径配置不正确导致的。请检查data目录及其子目录的读写权限,确保Web服务器用户有读取和写入的权限。确认config.php文件中的data目录路径设置正确。如果问题依旧存在,可以尝试清除浏览器缓存,或者重启Web服务器以应用更改。

在Dedecms 5.6/5.7系统中,转移data目录后网站验证码不显示的问题较为常见,以下是一些可能的解决方法:

为什么在将Dedecms 5.6/5.7系统转移到新的data目录后,网站的验证码无法显示?  第1张

1. GD库问题

验证码需要GD库支持,请检查你的环境是否已开启GD库。

2. 字体文件路径问题

打开 Include/vdimgck.php 文件,找到如下代码:

for($i=0;$i<$rndcodelen;$i++) {
    $bc = mt_rand(0, 1);
    $rndstring[$i] = strtoupper($rndstring[$i]);
    $c_fontColor = $fontColor[mt_rand(0,4)];
    $y_pos = $i==0 ? 4 : $i*($font_size+2);
    $c = mt_rand(0, 15);
    @imagettftext($im, $font_size, $c, $y_pos, 19, $c_fontColor, $font_file, $rndstring[$i]);
    $lastc = $rndstring[$i];
}

具体原因可能是字体文件路径不对,解决方法:

1、确认 include/data/fonts/ 里面存在字体文件,默认为 ggbi.ttf。

2、在 for($i=0;$i<$rndcodelen;$i++) 上一行加上如下代码:

$font_file= str_replace("\","/",$font_file);

即将字体文件路径中的反斜杠替换成斜杠,因为反斜杠有转译字符的功能,导致 Imagettftext() 函数总是返回错误。

3. data路径调整

如果将 data 目录转移到了其他位置,需要调整相关路径,打开 include 下的 vdimgck.php,找到如下代码:

require_once (dirname(__FILE__).'/../data/safe/inc_safe_config.php');
require_once (dirname(__FILE__).'/../data/config.cache.inc.php');
$config = array(
    'font_size'   => 14,
    'img_height'  => $safe_wheight,
    'word_type'  => (int)$safe_codetype,   // 1:数字  2:英文   3:单词
    'img_width'   => $safe_wwidth,
    'use_boder'   => TRUE,
    'font_file'   => dirname(__FILE__).'/data/fonts/ggbi.ttf',
    'wordlist_file'   => dirname(__FILE__).'/data/words/words.txt',
    'filter_type' => 5);
$sessSavePath = dirname(__FILE__)."/../data/sessions/";

将上述代码中的data 路径做相应的调整,如果将 data 移到网站根目录的上一级目录(服务器网站库目录),则需要在路径中加一个/..,改后如下:

require_once (dirname(__FILE__).'/../../data/safe/inc_safe_config.php');
require_once (dirname(__FILE__).'/../../data/config.cache.inc.php');
$config = array(
    'font_size'   => 14,
    'img_height'  => $safe_wheight,
    'word_type'  => (int)$safe_codetype,   // 1:数字  2:英文   3:单词
    'img_width'   => $safe_wwidth,
    'use_boder'   => TRUE,
    'font_file'   => dirname(__FILE__).'/data/fonts/ggbi.ttf',
    'wordlist_file'   => dirname(__FILE__).'/data/words/words.txt',
    'filter_type' => 5);
$sessSavePath = dirname(__FILE__)."/../../data/sessions/";

这样就可以解决由于路径问题导致的验证码不显示。

4. 配置文件修改

DedeV5.6新版统一将验证码的有效设置在【系统】→【验证码安全设置】里,可以设置哪些地方启用验证码,哪些地方不启用,还可以设置验证码类型,比如数字、英文与单词,修改后的保存实际上是修改了 datasafeinc_safe_config.php 这个文件,这是个配置文件。

$safe_gdopen = '1,2,3,5,6,7'; // 系统哪些地方开启验证码

如果不需要验证码,可以将其中的6 删除即可。

5. 通用解决方案

如果没有验证码无法进入后台,可以通过修改 PHP 文件源代码来取消后台验证码功能,方法如下:

打开 dede/login.php,找到如下代码:

if(($validate=='' || $validate != $svali) && preg_match("/6/",$safe_gdopen)){
ResetVdValue();
ShowMsg('验证码不正确!','login.php',0,1000);
exit;
}

将第一行替换为:

if(false){

这样即可取消验证码功能。

FAQs

1、Q: 如果验证码只显示背景而不显示字母怎么办?

A: 这是由于字体文件路径不对导致的,确认 include/data/fonts/ 里面存在字体文件,默认为 ggbi.ttf,在验证码生成文件 Include/vdimgck.php 中找到如下代码:

   for($i=0;$i<$rndcodelen;$i++) {
       $bc = mt_rand(0, 1);
       $rndstring[$i] = strtoupper($rndstring[$i]);
       $c_fontColor = $fontColor[mt_rand(0,4)];
       $y_pos = $i==0 ? 4 : $i*($font_size+2);
       $c = mt_rand(0, 15);
       @imagettftext($im, $font_size, $c, $y_pos, 19, $c_fontColor, $font_file, $rndstring[$i]);
       $lastc = $rndstring[$i];
   }

在 for($i=0;$i<$rndcodelen;$i++) 上一行加上如下代码:

   $font_file= str_replace("\","/",$font_file);

即将字体文件路径中的反斜杠替换成斜杠,因为反斜杠有转译字符的功能,导致 Imagettftext() 函数总是返回错误。

2、Q: 如果将 data 目录转移到了其他位置,如何调整相关路径?

A: 打开 include 下的 vdimgck.php,找到如下代码:

   require_once (dirname(__FILE__).'/../data/safe/inc_safe_config.php');
   require_once (dirname(__FILE__).'/../data/config.cache.inc.php');
   $config = array(
       'font_size'   => 14,
       'img_height'  => $safe_wheight,
       'word_type'  => (int)$safe_codetype,   // 1:数字  2:英文   3:单词
       'img_width'   => $safe_wwidth,
       'use_boder'   => TRUE,
       'font_file'   => dirname(__FILE__).'/data/fonts/ggbi.ttf',
       'wordlist_file'   => dirname(__FILE__).'/data/words/words.txt',
       'filter_type' => 5);
   $sessSavePath = dirname(__FILE__)."/../data/sessions/";

将上述代码中的 data 路径做相应的调整,如果将 data 移到网站根目录的上一级目录(服务器网站库目录),则需要在路径中加一个 /..,改后如下:

   require_once (dirname(__FILE__).'/../../data/safe/inc_safe_config.php');
   require_once (dirname(__FILE__).'/../../data/config.cache.inc.php');
   $config = array(
       'font_size'   => 14,
       'img_height'  => $safe_wheight,
       'word_type'  => (int)$safe_codetype,   // 1:数字  2:英文   3:单词
       'img_width'   => $safe_wwidth,
       'use_boder'   => TRUE,
       'font_file'   => dirname(__FILE__).'/data/fonts/ggbi.ttf',
       'wordlist_file'   => dirname(__FILE__).'/data/words/words.txt',
       'filter_type' => 5);
   $sessSavePath = dirname(__FILE__)."/../../data/sessions/";

这样就可以解决由于路径问题导致的验证码不显示。

0