概述
有些情况数据需要更高的安全性,需要避免第三方工具抓包进行对数据修改,因此在表单提交/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哈希值
获取表单提交的原始数据,此步骤不能使用_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();
}
}
网友评论