[PHP]接口请求校验的原理
具体的校验步骤可以自定义,下面是比较直观的一种形式:
1. 客户端:请求参数带上时间,进行首字母排序,连接私钥后,取得加密结果;
客户端请求时带上这个加密结果作为sign参数。
2. 服务端:对sign参数进行校验(过程同上),如果正确且在有效期内,则通过。
示例程序:
<?php
/**
* SignCheck : session key 对称式 加密校验.
*
* 注:公私钥模式可以避免私钥被窃取.
*
* @farwish.com
*/ // Client: $time = time();
$url = "b=v1&a=v2&c=v3&time={$time}";
// Client和Server通用私钥.
$uuid = 'b9514c52-5363-4364-b73f-a2ec93ae6b34'; function getSign($url, $uuid, $encode = true)
{
parse_str( $url, $arr ); if (! $encode ) {
unset($arr['sign']);
} // 1. 参数按首字母排序
ksort($arr, SORT_REGULAR); $str = http_build_query($arr); // 2. 参数字符串拼接私钥(TODO自定义)
$new_str = $str . $uuid; // 3. 生成新sign(TODO自定义)
$sign = openssl_encrypt($new_str, 'AES-128-CBC', $uuid, OPENSSL_RAW_DATA, substr($uuid, 0, 16));
return md5($sign);
} // 4. 参数拼接sign进行请求
$client_sign = getSign($url, $uuid);
$request_url = $url . "&sign={$client_sign}"; // Server: // 去除sign重新校验,并检查time有效期
$server_sign = getSign($request_url, $uuid, false); //sleep(4); if ( ($client_sign == $server_sign) &&
( (time() - $time) < 5 )
) {
echo "{$server_sign} 有效,且在有效期内.\n";
} else {
echo "无效请求.\n";
}
Source:https://github.com/farwish/php-lab/blob/master/lab/SignCheck.php
Bound in Library:https://github.com/farwish/alcon/blob/master/src/Supports/Helper.php
Tests:https://github.com/farwish/alcon/blob/master/tests/Supports/HelperTest.php
小结:这种校验方式,只有完全知道了校验算法的客户端才能模拟合法请求,防止数据篡改,相对安全。
如果需要验证用户登录的情况,可以使用JWT的方式。
Link:http://www.cnblogs.com/farwish/p/6700518.html
[PHP]接口请求校验的原理的更多相关文章
- 利用 Bean Validation 来简化接口请求参数校验
团队新来了个校招实习生静静,相互交流后发现竟然是我母校同实验室的小学妹,小学妹很热情地认下了我这个失散多年的大湿哥,后来... 小学妹:大湿哥,咱们项目里的 Controller 怎么都看不到参数校验 ...
- Springboot + redis + 注解 + 拦截器来实现接口幂等性校验
Springboot + redis + 注解 + 拦截器来实现接口幂等性校验 1. SpringBoot 整合篇 2. 手写一套迷你版HTTP服务器 3. 记住:永远不要在MySQL中使用UTF ...
- ruoyi接口权限校验
此文章属于ruoyi项目实战系列 ruoyi系统在前端主要通过权限字符包含与否来动态显示目录和按钮.为了防止通过http请求绕过权限限制,后端接口也需要进行相关权限设计. @PreAuthorize使 ...
- API接口签名校验
在开发app中,我们经常要为app提供接口.但是为了保证数据的安全,我们通常会对接口的参数进行加密. 1.不验证的接口api api接口请求,"http://www.xx.com/getUs ...
- Springboot学习06-Spring AOP封装接口自定义校验
Springboot学习06-Spring AOP封装接口自定义校验 关键字 BindingResult.Spring AOP.自定义注解.自定义异常处理.ConstraintValidator 前言 ...
- Vue + webpack 项目配置化、接口请求统一管理
准备工作 需求由来: 当项目越来越大的时候提高项目运行编译速度.压缩代码体积.项目维护.bug修复......等等成为不得不考虑而且不得不做的问题. 又或者后面其他同事接手你的模块,或者改你的bug ...
- 【转】js生成接口请求参数签名加密
js生成接口请求参数签名加密 签名算法规则: 第一步,设所有发送或者接收到的数据为集合M,将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),使用URL键值对的格式(即key1=v ...
- C# 动态创建SQL数据库(二) 在.net core web项目中生成二维码 后台Post/Get 请求接口 方式 WebForm 页面ajax 请求后台页面 方法 实现输入框小数多 自动进位展示,编辑时实际值不变 快速掌握Gif动态图实现代码 C#处理和对接HTTP接口请求
C# 动态创建SQL数据库(二) 使用Entity Framework 创建数据库与表 前面文章有说到使用SQL语句动态创建数据库与数据表,这次直接使用Entriy Framwork 的ORM对象关 ...
- 超高性能管线式HTTP请求(实践·原理·实现)
超高性能管线式HTTP请求(实践·原理·实现) 一.总结 一句话总结:实际pipe早就被http1.1所支持,并且大部分nginx服务器也支持并开启了这一功能. pipe之所以能比常规请求方式性能高出 ...
随机推荐
- [bzoj2286] [Sdoi2011消耗战
还是虚树恩..模板都能打挂QAQ 先在原树上预处理出mndis[i],表示根节点到节点i 路径上边权的最小值(就是断开i与根的联系的最小花费) 建完虚树在虚树上跑树形DP..f[i]表示断开 i 所 ...
- [国嵌攻略][165][usb下载线驱动设计]
查看USB设备的生产商ID和设备ID 示例: lsusb Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub 生产商ID是1d ...
- POJ 1502 MPI Maelstrom(模板题——Floyd算法)
题目: BIT has recently taken delivery of their new supercomputer, a 32 processor Apollo Odyssey distri ...
- textarea自适应高度,div模仿textarea可编辑实现自适应高度,placeholder使用图标
1.textarea自适应高度,placeholder使用图标 自适应高度,有很多种办法: 1)jq: $("textarea").on("input",fun ...
- PhpStorm常用的一些快捷键
Ctrl + G : 跳到当前打开文件的行,输入格式(行数:列数)Ctrl + E : 打开最近编辑的文件列表Ctrl + P : 显示函数的参数信息Ctrl + Q : 快速打开函数的说明 ...
- 关于在vue-cli中使用微信自动登录和分享
(以下所有接口由后台提供) 一.微信自动登录 //定义事件 methods:{ //判断是否微信登陆 是不是微信浏览器 isWeiXin() { let ua = window.navigator.u ...
- 织梦dede列表调用图集的第一张图片大图原图地址(非缩略图)
dede(55) 我们在使用dede图片集的时候经常会碰到列表页或者内容页要调用一张图片而并非缩略图,那么碰到这样的问题怎么办呢?今天就给大家分享一个解决办法: 步骤一: 修改include/exte ...
- MYSQL 数据库导入导出命令
在不同操作系统或MySQL版本情况下,直接拷贝文件的方法可能会有不兼容的情况发生.所以一般推荐用SQL脚本形式导入.下面分别介绍两种方法. MySQL命令行导出数据库 1,进入MySQL目录下的bin ...
- log4j:ERROR Category option " 1 " not a decimal integer.错误解决
log4j.properties 的配置文件中: log4j.appender.stdout.layout.ConversionPattern = %d{ABSOLUTE} %5p %c{ 1 }: ...
- Spring 数据库连接(Connection)绑定线程(Thread)的实现
最近在看spring事务的时候在想一个问题:spring中的很多bean都是单例的,是非状态的,而数据库连接是一种有状态的对象,所以spring一定在创建出connection之后在threadloc ...