梦想之家

PHP生成sign验证接收的数据是否合法

下面的加密是使用的MD5的,也可以根据自己的需求随便更换加密方式做sign验签。
废话不多说,直接上代码:

<?php
//签名的密钥,可以换成自己的
$signKey = 'Dcr163!#!!.cn!!$$%&&xi.+';

if( isset($_POST['type']) ) {
    //这里获取数据
    $sendData = $_POST;
    //未传sign提示报错
    if( !isset($sendData['sign']) ) exit('sign不能为空!');
    //保存传过来的sign参数
    $sendSign = $sendData['sign'];
    //删除sign在传递中的数据,方便在下面的生成签名使用
    unset($sendData['sign']);
    //数据排序
    ksort($sendData);
    //生成签名,把传递的数据生成 a=1&c=2sss&=bb=jj  格式,加签名的密钥 用md5加密
    $sign = md5(http_build_query($sendData).$signKey);
    //默认提示信息
    $strMsg = '数据验证成功!';
    // 用新生成的 sign和传递过来的sign对比,如果一样就代表验证成功,否则就验证失败。或许是接受的数据和发送的的数据不一致,被篡改了;或许是双方加密的密钥不一致。
    if( $sign !== $sendSign ) $strMsg = 'sign验证失败!';
    exit('<br/>'.$strMsg.'<a href="?"> 返回 </a>');
}


///下面是模拟请求的数据
$time = time();
$data = array(
    'type'   => 'create',
    'name'=>'小红',
    'age'   => 16,
    'weigth'    => 100,
    'height'    => 160,
    'sex'   => '女',
    'remark'    => '备注信息',
    'time'      => $time
);

//排序
ksort($data);
// 变成字符串 a=1&c=2sss&=bb=jj
$req = http_build_query($data);
//生成sign
$sendSign = md5($req.$signKey);

//下面是模拟发送请求的HTML页面
$html = '<input type="hidden" name="sign" value="'.$sendSign.'"> ';
foreach ($data as $k=>$v) {
    $html .= '<p><input type="text" name="'.$k.'" value="'.$v.'" readonly/></p>';
}
echo <<<HTML
<form action="?" method="post">
    $html
    <input type="submit" value="提交">
</form>
HTML;


相关推荐

您此刻的心情: