验证码异常

创建于 2021-08-17 / 最近更新于 2022-05-27 / 3548
字体: [默认] [大] [更大]

PESCMS系列软件验证码逻辑都大体一致。若您出现验证码异常问题,请参考本指南进行排错。

验证码不显示

验证码不显示原因很多,有程序安装目录不正确导致请求丢失,还有PHP的环境没有配置好等等。下面我们整合了常见的排错方式给大家。

排查安装目录

先确认您访问系统时,浏览器显示的URL是否带有Public 关键词。若有那么说明您安装环境没有指向到Public目录。请参考《软件安装》一文进行调整。

若您无法确认URL的话,可以找到验证码显示异常的地方。进行如下操作:

  1. 找到验证码显示出错的页面,并在该地方右键,选择“在新标签打开图片” 。如下图所示:

    新标签打开图标

  2. 在浏览器新标签打开的图片,若直接提示404之类的界面。如下图所示:

    404

  3. 请参考《软件安装》一文进行调整。

检查安装环境

根据排查安装目录方式发现,打开地址没有显示404相关页面,而是以图片形式的显示。如下图所示:

以图片形式显示

这种状况基本属于您的系统没有部署好运行环境所致的。根据如下方式排查:

  1. 在Public目录下创建一个随意命名的.php文件。如:mydebug.php 。并输入如下代码

    <?php
    phpinfo();
    ?>
    
  2. 在浏览器URL地址栏输入我们刚才创建的PHP文件。如我的域名是:https://example.com/。那么我在浏览器则https://example.com/mydebug.php 。

  3. mydebug.php文件会输出您当前运行环境的php信息。您找到GD库相关信息,如下图所示是PESCMS官方的GD库运行参照图:

    GD库

  4. 您根据您的环境显示的GD库信息,和上图进行一个对比。看看是缺少那个库所引起的。

  5. 根据实际反馈,大多数是由于GD库:缺少freetype引起的。

验证码不一致

当您出现验证码不一致的情况下,请刷新页面或者多点几次验证码刷新。有时候网络波动会导致服务器保存的验证码hash和页面显示的不一致。

若问题依旧,您需要检查当前使用什么浏览器。 一般来说,Chrome、Edge,Safari浏览器都不会出现问题。 若您使用的是国产浏览器,可能由于浏览器内置了网络加速,缓存了您服务器验证码图片,导致验证码显示不一致。

校验验证码

对于这种问题,您需要进行代码调试。打开程序的\Core\Controller\Controller.php,定位到checkVerify()方法,大概添加如下代码:

/**
 * 验证验证码
 */
protected static function checkVerify() {
    if (empty($_REQUEST['verify'])) {
        self::error('请输入验证码');
    }

    echo '<pre>';
    print_r("用户提交过来的原验证码".$_REQUEST['verify']);
    echo '<br/>';
    print_r("用户提交的验证码,已转换匹配值:".md5(strtolower($_REQUEST['verify'])));
    echo '<br/>';
    print_r("图片验证码的结果:".self::session()->get('verify'));
    echo '<br/>';
    echo '</pre>';
    echo '<br/>';
    exit;


    if (md5(strtolower($_REQUEST['verify'])) !== self::session()->get('verify')) {
        self::error('验证码不一致');
    }

    self::session()->delete('verify');

}

代码添加完毕后,在当前要输入验证码的地方,按下F12或者右键查看元素。弹窗开发者工具后,提交一次验证码。完成提交后,根据下图信息校验内容。

(W9OP01C8R27KI3KL41IPD4.png

多尝试几次看看提交的值和图片验证码是否一致。

获取原验证码

若您根据上面指引,提交多次验证码都不对。这时候您需要强制打印原验证码了。找到显示验证码的页面,右键复制图片链接。如下图所示:

login.gif

上图中,我们得到的URL地址为:https://域名/?m=Index&a=verify 。根据您使用的程序(DOC默认组是Doc),完整的文件在 \App\Doc\GET\Index.php 。

我们用编辑器打开上述文件,并添加如下代码:

public function verifyTest(){
        echo $this->session()->get('verifyTest');
}

image.png

接着打开\Expand\Verify.php 大概58行插入如下代码:

\Core\Func\CoreFunc::session()->set('verifyTest', strtolower(implode('', $verify)));

image.png

保存修改后,在浏览器新建一个标签打开如下链接:

http://您的域名/?m=Index&a=verifyTest

接着回到要提交验证码的地方,刷新一下之后什么都别操作。在打开刚才新建的标签页面。校验一下页面显示的验证码图片和原验证码是否一致,如下图所示

login.gif

确认一致后,在提交数据看看。按理来说原验证码和图片显示都一致了,你提交过去的也必定一致。

最后调试完毕后,记得将代码回滚

2 人点赞过