表单提交数据防篡改

2019-08-21  本文已影响0人  胡乱唱歌ing

概述

有些情况数据需要更高的安全性,需要避免第三方工具抓包进行对数据修改,因此在表单提交/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();
        }

    }
上一篇下一篇

猜你喜欢

热点阅读