[hash]数据验证失败

学无止境✅  2015-12-10
0


最近逐日者在使用phpcms做一些后台二次开发的时候遇到了这个问题:

即当写好一些功能方法的执行的时候,返回这个错误“[hash]数据验证失败”。
于是本人在网上也找了几个对于类似问题的解答,但是本人认为不够深入或者说解决办法只停留在表层,如果你想真正了解其中发生了什么到这这个错误并对应真是的原因去解决错误,那就跟所追太阳小站长去探索一下吧!
问题描述:
逐日者就拿其中一个报错的程序执行流程来作为示例:

1
$.getJSON("?m=content&c=content&a=get_players&pid=3429", function(json){
通过js中的异步去调用content模块content控制器中的get_players方法,那么报这个错误可能是词函数中调用的某处地方出发了hash验证或者词方法所在的类里的__construct()里出发了hash验证:

1
2
3
4
5
6
7
public function get_players(){
            $pid = intval($_GET['pid']);
            echo 111;
//            $this->db_linkage=pc_base::load_model('linkage_model');
//            $infos = $this->db_linkage->get_one_level($pid);
//            p($infos);
        }
如上代码,把此函数的调用基本都去掉仍然会包此hash验证错误,那么说明验证调用在__construct()里,通过追溯父级类中的__construct()我们找到了
self::check_hash();
即一下验证hash的方法(位置在\phpcms\modules\admin\classes\admin.class.php):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/**
     * 检查hash值,验证用户数据安全性
     */
    final private function check_hash() {
        if(preg_match('/^public_/', ROUTE_A) || ROUTE_M =='admin' && ROUTE_C =='index' || in_array(ROUTE_A, array('login'))) {
            return true;
        }
        if(isset($_GET['pc_hash']) && $_SESSION['pc_hash'] != '' && ($_SESSION['pc_hash'] == $_GET['pc_hash'])) {
            return true;
        } elseif(isset($_POST['pc_hash']) && $_SESSION['pc_hash'] != '' && ($_SESSION['pc_hash'] == $_POST['pc_hash'])) {
            return true;
        } else {
            showmessage(L('hash_check_false'),HTTP_REFERER);
        }
    }
分析以上函数可知通过验证第一种方法是在你定义的方法名称之前加“public_”前缀;第二站方法是在get或post里加入pc_hash参数,其值是$_SESSION['pc_hash']。

于是,我上面的get_players方法改名为public_getjson_players就ok了。

关于phpcms二次开发中方法出现[hash]数据验证失败问题分析作此记便于以后自己勿忘和各位网友交流分

游客  现在