php的url的query部分签名实现

代码

<?php



/* url请求防窜改的签名法
   只基本query部分签名,如果想考虑host与path部分请做为一个参数放到query中
   $url 是带有query部分的url,没设置第二个参数表示生成签名url,返回签名值,需要自己拼接到url中.
   $signVar url中属于签名参数名称,设置值是就是表示比较方式,返回值,成功返回 true,失败返回新的签名串,所以请使用===来比较是否成功
   注意签名只对url部分的query进行签名,所以,其它部分发生变化时,并不会影响比对结果,也就是说会认为是没被窜改,因为其它部分进行窜改请求接受方就会发生变化,就没意义.
   且会对query进行按参数名称进行排序,所以,参数的排列位置并不会影响签名结果.
   */

function urlSign ($url, $signVar = null, $pwd = '中国国是吉国这是密码串**&&#)轱辘中是地. ') {
    if (empty($url)) {//url不能为空
        exit('urlSign方法的url参数不能是空字符串');
    }
    
    $urls = parse_url($url);
    
    if (!is_array($urls)) {
        exit('urlSign方法的url参数可能是无效url字符串,解析失败:'.var_dump($urls));
    }

    if (empty($urls['query'])) {
        exit('urlSign方法的url参数url字符串没有包含query部分:'.var_dump($urls));
    }
    
    parse_str($urls['query'], $query);
    
    if (!ksort($query, SORT_STRING)) {
        exit('urlSign方法的$query排序失败:'.var_dump($urls));
    }
    
    if (is_null($signVar)) {//签名,返回签名值
        return sha1(implode($pwd, $query).$pwd.implode($pwd, array_keys($query)));
    }
    
    if (empty($query[$signVar])) {
        exit('urlSign方法的比较模式时必须指定原签名参数:'.var_dump($urls));
    }
    
    $oldSign = $query[$signVar];
    unset($query[$signVar]);
    $newSign = sha1(implode($pwd, $query).$pwd.implode($pwd, array_keys($query)));
    return $oldSign === $newSign ? true : $newSign;
}

$url = 'http://www.qq.com/?uid=123456&username=qidizi&email=qidizi@qq.com&op=i_am_ok&time=12345679';
echo "原来的url是:{$url}<br/>";
$sign = urlSign($url);
echo "原来的url签名串:{$sign}<br/>";
$url = $url.'&sign='.$sign;
echo "原来的url签名后的组成是:{$url}<br/>";
$isSame = urlSign($url, 'sign');
echo "原来的url签名后的url(附加了签名串)比较是否有人窜改结果:".var_export($isSame, 1)."<br/>";
$urlRe = str_replace('&username=qidizi', '&username=qidizi1', $url);
$isSame = urlSign($urlRe, 'sign');
echo "原来的url({$url})签名后的进行窜改后url(qidizi变成了qidizi1{$urlRe})比较是否有人窜改结果(这里输出是true时就表示一样,如果是签名串就是不一致,挨窜改了):".var_export($isSame, 1)."<br/>";
$urlRe = str_replace('http://www.qq.com/', 'http://www.qidizi.com/', $url);
$isSame = urlSign($urlRe, 'sign');
echo "原来的url({$url})签名后的进行窜改后url(域名发生了变化{$urlRe})比较是否有人窜改结果(这里输出是true时就表示一样,如果是签名串就是不一致,挨窜改了):".var_export($isSame, 1)."<br/>";


---------------------输出结果------------------




原来的url是:http://www.qq.com/?uid=123456&username=qidizi&email=qidizi@qq.com&op=i_am_ok&time=12345679
原来的url签名串:e6dc0e6a0a6cc4d08d3256af3f0c99ac1001b298
原来的url签名后的组成是:http://www.qq.com/?uid=123456&username=qidizi&email=qidizi@qq.com&op=i_am_ok&time=12345679&sign=e6dc0e6a0a6cc4d08d3256af3f0c99ac1001b298
原来的url签名后的url(附加了签名串)比较是否有人窜改结果:true
原来的url(http://www.qq.com/?uid=123456&username=qidizi&email=qidizi@qq.com&op=i_am_ok&time=12345679&sign=e6dc0e6a0a6cc4d08d3256af3f0c99ac1001b298)签名后的进行窜改后url(qidizi变成了qidizi1http://www.qq.com/?uid=123456&username=qidizi1&email=qidizi@qq.com&op=i_am_ok&time=12345679&sign=e6dc0e6a0a6cc4d08d3256af3f0c99ac1001b298)比较是否有人窜改结果(这里输出是true时就表示一样,如果是签名串就是不一致,挨窜改了):'b8a440cf70d0e2dfdd5ac92ac4a45a5cfa941e1c'
原来的url(http://www.qq.com/?uid=123456&username=qidizi&email=qidizi@qq.com&op=i_am_ok&time=12345679&sign=e6dc0e6a0a6cc4d08d3256af3f0c99ac1001b298)签名后的进行窜改后url(域名发生了变化http://www.qidizi.com/?uid=123456&username=qidizi&email=qidizi@qq.com&op=i_am_ok&time=12345679&sign=e6dc0e6a0a6cc4d08d3256af3f0c99ac1001b298)比较是否有人窜改结果(这里输出是true时就表示一样,如果是签名串就是不一致,挨窜改了):true

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是PHP实现腾讯云对象存储API签名的代码: ```php <?php // 腾讯云对象存储API的endpoint和密钥 $endpoint = "https://your-bucket.cos.ap-guangzhou.myqcloud.com"; $secretId = "your-secret-id"; $secretKey = "your-secret-key"; function getAuthorization($method, $path, $headers, $params) { global $secretId, $secretKey; $qSignAlgorithm = "sha1"; $qAk = $secretId; $qSignTime = time() . ";" . (time() + 3600); // 签名过期时间为当前时间+1小时 $qKeyTime = $qSignTime; $qHeaderList = implode(";", array_keys($headers)); $qUrlParamList = implode(";", array_keys($params)); $url = parse_url($path); $qPath = isset($url['path']) ? $url['path'] : '/'; $qPath .= isset($url['query']) ? '?' . $url['query'] : ''; $qSignString = implode("\n", array( $method, $qPath, http_build_query($params), implode("\n", array_map(function($k, $v) { return strtolower($k) . ":" . $v; }, array_keys($headers), $headers)), '', $qHeaderList, '', $qUrlParamList, )); $qSignKey = hash_hmac("sha1", $qKeyTime, $secretKey, true); $qSignature = hash_hmac($qSignAlgorithm, $qSignString, $qSignKey); return "q-sign-algorithm=" . $qSignAlgorithm . "&q-ak=" . $qAk . "&q-sign-time=" . $qSignTime . "&q-key-time=" . $qKeyTime . "&q-header-list=" . $qHeaderList . "&q-url-param-list=" . $qUrlParamList . "&q-signature=" . $qSignature; } // 示例:上传文件到腾讯云对象存储 $file = "/path/to/your/file.jpg"; $bucket = "your-bucket"; $key = "file.jpg"; $headers = array( "Host" => "your-bucket.cos.ap-guangzhou.myqcloud.com", "Content-Type" => "image/jpeg", "Content-Length" => filesize($file), ); $params = array( "op" => "upload", "insertOnly" => "0", "bizAttr" => "", "version" => "1", ); $authorization = getAuthorization("PUT", "/" . $key, $headers, $params); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $endpoint . "/" . $key . "?" . http_build_query($params)); curl_setopt($ch, CURLOPT_PUT, 1); curl_setopt($ch, CURLOPT_INFILE, fopen($file, "r")); curl_setopt($ch, CURLOPT_INFILESIZE, filesize($file)); curl_setopt($ch, CURLOPT_HTTPHEADER, array( "Authorization: " . $authorization, "Content-Type: " . $headers["Content-Type"], "Content-Length: " . $headers["Content-Length"], )); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $response = curl_exec($ch); curl_close($ch); echo $response; ?> ``` 以上代码中,`getAuthorization`函数用于生成腾讯云对象存储API的签名,`$headers`和`$params`参数分别为HTTP请求的头部和参数,`$method`和`$path`参数分别为HTTP请求的方法和路径。 示例中使用了`curl`库来上传文件到腾讯云对象存储,需要先将文件内容读入到内存中,然后通过`CURLOPT_INFILE`和`CURLOPT_INFILESIZE`选项传递给`curl`库。`$bucket`和`$key`参数分别为腾讯云对象存储的存储桶和对象名称。上传文件时,需要指定`op=upload`参数,表示上传操作。其他参数可根据需要进行设置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值