最近给公司搭建了一个Discuz站点,可是发现验证码无法显示。然后拿自己网站检查了一下,发现也有一样的问题,尝试在新标签中打开验证码,发现页面显示:Access Denied。 OK,那么就是程序中某些问题导致了页面被打断。网上搜索了一下,发现这个问题从X3.1开始就存在了,网上教的都是在后台的“防灌水->验证设置->验证码类型”中选择其中一项,并清除缓存。 显然,这办法兵没有奏效。而且我的网站在X3.0的时候就已经选择过验证码类型,问题也依然存在。 于是尝试从代码开始着手,验证码的URL如下: http://论坛地址/misc.php?mod=seccode&update=46484&idhash=cSZrt0CM 从mod这个参数中可得知处理验证码的文件是source/module/misc/misc_seccode.php。打开这个文件,通过逐行插入断点的方式查找意外跳出的代码,最终将问题定位到了第94-96行。

    // if($_G['setting']['seccodedata']['type'] < 2 && ($refererhost['host'] != $_SERVER['HTTP_HOST']) || $_G['setting']['seccodedata']['type'] == 2 && !extension_loaded('ming') && $_POST['fromFlash'] != 1 || $_G['setting']['seccodedata']['type'] == 3 && $_GET['fromFlash'] != 1) {
    //     exit('Access Denied');
    // }

正是这段判断不通过而导致验证码显示的过程被中断。时间所迫,我没对这段判断的逻辑做过多的分析,粗略看一下大概这是一段用于安全的判断,到底是它逻辑有误还是我的配置问题我也没能花时间一一分析,有兴趣的朋友可以做一下详细的分析吧~~ 问题定位到了,那么我直接注释这段代码吧。代码注释过后,验证码正常显示,问题解决。 当然这并不是最完善的解决方式,我这做法不过是绕过了本应有的判断问题。也希望Discuz官方能尽快给出官方解释解决这个问题~~