PHP 对参数签名
- 对参数进行签名防止参数劫持
- 加入timestamp, 防止DOS攻击(但这次没有实现这个功能,后续再实现)
interface BaseToken
{ /**
* @param params array|string 前端请求的参数
* @param key string 秘钥
* @return sign string
*/
public function getSign($params, string $key);
} class Token implements BaseToken
{ public $privateKey = 'thisisprivateKey!!'; /**
* 后端根据前端的参数生成的签名, 签名是防止参数劫持
* 还可以判断timestamp,防止DOS攻击
* @return sign
*/
public function getSign($params, string $privateKey)
{
//有的接口可能需要判断timestamp,防止DOS攻击,判断是否传入了timestamp
if(isset($params['timestamp'])){
if(abs($params['timestamp']-time()) > 60*15){
return ['code'=>10001, 'msg'=>'timestamp失效,请重新发送请求'];
}
}
$string = '';
foreach ($params as $key => $value) {
// firstly unset value of empty
if(!$value){
unset($params[$key]);
}
}
//参数名按ASCII吗从小到大排序(字典序)
ksort($params);
$str = '';
foreach ($params as $key => $value) {
//前端请求的参数里面是包含sign的,需要过滤。,timestamp 也参与签名.
if($key != 'sign' && !is_array($value))
$str .= $key.'='.$value.'&';
}
//拼接privateKey,签名
$str .= 'key='.$privateKey;
$sign = strtoupper(md5($str));
return $sign;
} // check value is or not empty
//获取传入的参数,参数个数不确定,类型不确定
public function handle($json)
{
// $params = func_get_args(); //结果是索引数组,不是关联数组
$params = json_decode($json, true);
$sign = $this->getSign($params, $this->privateKey);
if($params['sign'] == $sign){
return 'success';
}else{
return 'sign fail';
}
}
} //模拟前端发送请求数据,使用json格式,func_get_args()返回的不是关联数组,无法使用签名。
$user = 'bneglect';
$timestamp = 1576659396; //time()
$str = '';
$str .= 'timestamp='.$timestamp.'&user='.$user.'&key=thisisprivateKey!!';
$sign = strtoupper(md5($str));
$json = ['user'=>$user, 'timestamp'=>$timestamp, 'sign'=>$sign];
$json = json_encode($json); //调用对象
$token = new Token;
echo $token->handle($json);
PHP 对参数签名的更多相关文章
- [置顶]
webapi token、参数签名是如何生成的
一个问题 在这里我想问大家一句,如果你向一个刚刚接触.net web后端程序开发的同学(别人刚刚也就学了webform的request,response,会提交表单的这种刚接触不久的同学),你怎么去解 ...
- 防盗链之URL参数签名
一.概述 传统的 IP 禁用.referer 防盗链.User-Agent 防盗链.地区访问控制等防盗链措施已经无法完全满足用户要求,所以开发出URL参数签名方式来防盗链 二.实现 Token防盗链是 ...
- C# 参数签名字符串按 ASCII码排序,注意其中的坑
参数签名中通常是按键值对中键名称的ASCII按从小到大的顺序排序后进行hash为签名字符串.不要直接使用 SortedDictionary<string, string> 有坑的,他是按数 ...
- 参数签名ascii码排序的坑
参数签名中通常是按键值对中键名称的ASCII按从小到大的顺序排序后进行hash为签名字符串.不要直接使用 SortedDictionary<string, string> 有坑的,他是按数 ...
- 【转】js生成接口请求参数签名加密
js生成接口请求参数签名加密 签名算法规则: 第一步,设所有发送或者接收到的数据为集合M,将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),使用URL键值对的格式(即key1=v ...
- 防盗链之URL参数签名 总结
一.概述 传统的 IP 禁用.referer 防盗链.User-Agent 防盗链.地区访问控制等防盗链措施已经无法完全满足用户要求,所以开发出URL参数签名方式来防盗链 二.实现 Token防盗链是 ...
- webapi token、参数签名是如何生成的(转载)
API接口保障安全性原则:1.有调用者身份2.请求的唯一性3.请求的参数不能被篡改4.请求的有效时间 在刚接触接口开发时,可能脑子里压根就没有这个接口调用安全性的原则,但常识性的经验告诉我们,每一个请 ...
- js生成接口请求参数签名加密
js生成接口请求参数签名加密 定义规则:将所有参数字段按首字母排序, 拼接成key1 = value1 & key2 = value2的格式,再在末尾拼接上key = appSecret, 再 ...
- Jmeter的参数签名测试
简介 参数签名可以保证开发的者的信息被冒用后,信息不会被泄露和受损.原因在于接入者和提供者都会对每一次的接口访问进行签名和验证. 签名sign的方式是目前比较常用的方式. 第1步:接入者把需求访问的接 ...
- WebApi安全性 参数签名校验(结合Axios使用)
接口参数签名校验,是WebApi接口服务最重要的安全防护手段之一. 结合项目中实际使用情况,介绍下前后端参数签名校验实现方案. 签名校验规则 http请求,有两种传参形式: 1.通过url传参,最常见 ...
随机推荐
- MySQL 索引最佳实践
原文请关注 这里 这是 文章 的翻译,在翻译过程中,会对其中涉及到的语句加上一些个人理解以及 SQL 语句的执行,并进行特别的标注. 1. 你做了一个很棒的选择,因为: 对于普通开发者和 DBA,理解 ...
- todo---git 生成密钥 原理分析
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDRJkDZ2z7syFC2QDCaORKF41ecwbL/kyFwkycOVE3MavTRBliAhoAhOaZQTr4j ...
- WUSTOJ 1335: Similar Word(Java)
题目链接:1335: Similar Word Description It was a crummy day for Lur. He failed to pass to the CET-6 (Col ...
- golang开发:环境篇(四)包管理器 glide的使用
glide 是golang项目开发中是特别重要的软件,没有它,golang的项目可能都无法发布. 为什么要使用glide 平时我们开发Go项目的时候,使用第三方的包的时候都直接使用go get 去获取 ...
- java EE学习之数据库操作
jdbc开发流程 注册驱动 建立连接(Connection) 创建运行SQL的语句(Statement) 运行语句 处理运行结果(ResultSet) 释放资源 注冊驱动有三种方式: Class.fo ...
- 全栈项目|小书架|服务器开发-NodeJS 项目分包
唠嗑 参考的是慕课网七月老师的课程,七月的课质量真的挺高的,推荐一波.这次的小书架项目源码不会全部公开,因为用了七月老师课程的绝大部分代码.虽然代码不全,但是只要思路看得懂,代码实现就很简单了. 小书 ...
- Spring Security Oauth2 : Possible CSRF detected
Spring Security Oauth2 : Possible CSRF detected 使用Spring Security 作为 Oauth2 授权服务器时,在授权服务器登录授权后,重定向到客 ...
- java.lang.NoClassDefFoundError: org/springframework/core/env/EnvironmentCapa
java.lang.NoClassDefFoundError: org/springframework/core/env/EnvironmentCapa 少导入包!spring-core-*.jar ...
- 使用swap扩展内存
当系统在内存不够用的时,新建一个swap文件,这个文件可以把内存中暂时不用的传输到对应的swap文件上,相当于扩展了内存的大小,具体使用方法如下: swap文件可以自己选择放在哪里,自己新建一个对应的 ...
- js入门之DOM
一.理解Web API Web API Application Programming Interface 应用程序编程接口, 是一个预先定义好的函数和方法 目的是提供应用程序与开发人员基于某软件或硬 ...