美文网首页
表单提交数据防篡改

表单提交数据防篡改

作者: 胡乱唱歌ing | 来源:发表于2019-08-21 11:16 被阅读0次

    概述

    有些情况数据需要更高的安全性,需要避免第三方工具抓包进行对数据修改,因此在表单提交/ajax提交数据时需要数据强一致性。

    image.png

    解决逻辑

    前段页面

    监听ajax提交,把提交的数据md5哈希,并往http header头写入X-Token

    $(document).ready(function(){
        
        #监听ajax提交,把提交的数据md5哈希,并往http header头写入X-Token
        $.ajaxPrefilter(function (options, originalOptions, xhr) {
                if(options.type == "POST" || options.type=="post")
                {
                    xhr.setRequestHeader('X-Token', md5(options.data+'password'));
                }
            });
    })
    

    后端验证md5哈希值

    获取表单提交的原始数据,此步骤不能使用_POST,_REQUEST因为这样可能会导致md5验证不通过的问题

    public function validateSecurityKey()
        {
            //取消传参的$data ,因为表单传过来的数据经过PHP key-val处理后,会导致md5一致性的问题
            #注意:只能获取到form表单enctype=application/x-www-form-urlencoded 提交的数据
            $source_data = file_get_contents("php://input");
    
            parse_str($source_data,$data);
            if(!$data)
            {
                throw new Exception("Error Processing Request", 1);
                 Yii::app()->end();
            }
            
            $security_key = $_SERVER['HTTP_X_TOKEN']??"";
    
            //这里做了一个表单提交隐藏域的兼容
            if(isset($data['HTTP_X_TOKEN']))
            {
                $security_key = $data['HTTP_X_TOKEN'];
                $source_data = str_replace("&HTTP_X_TOKEN=".$security_key, '',$source_data);
            }
    
            if(!$security_key)
            {
                throw new Exception("Error Processing Request", 1);
                Yii::app()->end();
            }
    
            $md5_str = md5($source_data.'password');
            if($md5_str != $security_key)
            {
                throw new Exception("Error Processing Request", 1);
                 Yii::app()->end();
            }
    
        }
    

    相关文章

      网友评论

          本文标题:表单提交数据防篡改

          本文链接:https://www.haomeiwen.com/subject/oclbsctx.html