服务器端数据合法性验证:签名sign和口令token原理
有时候,你也许会想:
我写的接口,那别人要是知道url,并且知道其需要的数据结构和逻辑,那不是都可以访问了?
甚至是,客户点传递过来的数据,是不是被恶意修改了?
这时,我们可能需要“验证”一下。比如:登录验证,只有登录以后才能来到后台。
这里给出几种【验证】方式,大神勿喷:
1:sign验证法:
这种验证方式,一般过程是:
第一:给你一个【私钥】[app_secret] 和[app_id]
第二:你要提交的所有数据都需要提供sign签名。
第三:sign签名的获取方式。
例如:给用户id为99的人增加100积分:
$app_id = 'Te001';
$secret = 'e10adc3949ba59abbe56e057f20f883e'; $url = 'http://127.0.0.1/test/apiDataCheck';
$post = array(
'user_id' => 99,
'point' => 100
); function addSign($url, $data){
$str = '';
$data['app_id'] = $app_id;
ksort($data);
foreach($data as $k => $v){
$str .= $k.'='.$v.'&';
}
$str = substring($str, 0, -1);
$str = $url.'?'.$str.$secret;
$data['sign'] = md5($str);
return $data;
} curl_post($url, addSign($url,$post));
addSign 就是一个sign的获取方式:所有数据加上app_id,字段顺序排序,以get参数方式连接。然后url+?+get参数+私钥,进行md5加密获取sign签名。进而进行接口调用。
第四:服务器端验证数据合法性。
$url = 'http://127.0.0.1/test/apiDataCheck';
$app_secret = 'select app_secret from app_id_secret where app_id='.intval($_POST['app_id']); function checkSign($url, $post){
$str = '';
$sign = $post['sign'];
unset($post['sign']);
foreach($post as $k => $v){
$str .= $k.'='.$v.'&';
}
$str = substring($str, 0, -1);
$str = $url.'?'.$str.$app_secret;
return $sign == md5($str);
} if($app_secret && checkSign($url, $_POST)){
$res = 'update user_point set point=point+100 where user_id='.$_POST['user_id'];
}
接口在操作数据之前,首先按照原本既定的sign生成方式,验证sign合法性,进而进行下一步操作。
很多第三方的接口都存在这样的一个签名验证,如:美团外卖和微信等。但其原理大同小异。
2:token法:
token法的步骤大概是:
1:给你一个app_id和app_secret。
2:提供一个利用app_id和app_secret获取token的接口。
3:token的时效性设定。
4:获取token接口的使用次数限制。
1:获取token
$app_id = 'Token001';
$app_secret = 'e10adc3949ba59abbe56e057f20f883e'; $url = 'http://127.0.0.1/token/getToken?app_id='.$app_ip.'&app_secret='.$app_secret; $token = curl_get($url); // $token = array(
// 'token' => 'e10adc3949ba59abbe56e057f20f883e',
// 'expire' => '1444444400'
// ); session('token', $token['token']);
session('expire', $token['expire']); 2:接口调用
$url = 'http://127.0.0.1/token/getUserInfo';
$post['user_id'] = 1;
if(time() < session('expire')){
$post['user_id'] = 1;
$post['token'] = session('token');
}else{
步骤1:
}
$userInfo = curl_post($post);
5:服务器验证token:
1:生成token并返回 define('EXPIRE', 3600);
$post = array(
$app_id = 'Token001';
$app_secret = 'e10adc3949ba59abbe56e057f20f883e';
);
$tcount = 'select count(*) from app_token where app_id='.$post['app_id'];
if($tcount >= 50){
// app_id 获取token次数太多
}else{
$token['token'] = md5($post['app_id'].time().$post['app_secret'].EXPIRE);
$token['expire'] = time()+EXPIRE;
$insert = 'insert into app_token value(null, '.$post['app_id'].', '.$token['token'].');';
} 2:接口验证token
$post = array(
$user_id = 1;
$token = 'e10adc3949ba59abbe56e057f20f883e';
);
$token = 'select token from app_token where app_id='.$post['app_id'].' order by id desc limit 1'; if($token == $post['token']){
return 'select * from user where user_id='.$post['user_id'];
}else{
// token 错误
}
token的生成办法可以自由设定,token的获取次数和过期时间都可以加进去。上例只是说明下原理和思路。
服务器端数据合法性验证:签名sign和口令token原理的更多相关文章
- 【接口安全】接口合法性验证加密验签SIGN 签名规则
在对接API接口时,接口地址和参数结构都很容易被黑客抓包,从而模拟发送请求. 考虑到安全性,防止别人冒名调用,要对接口请求进行合法性验证. 基本原理如下 双方约定 APPID:参与签名和网络传输 AP ...
- 微信支付java版V3验证数据合法性
[TOC] 1. 微信支付java版V3验证数据合法性 概要:使用微信支付接口时,微信会返回或回调给商户XML数据,开发者需要验证微信返回的数据是否合法. 特别提醒:商户系统对于支付结果通知的内容一定 ...
- MVC5 + EF6 + Bootstrap3 (15) 应用ModelState和Data Annotation做服务器端数据验证
Slark.NET-博客园 http://www.cnblogs.com/slark/p/mvc5-ef6-bs3-get-started-server-side-validation.html 系列 ...
- 微软企业库5.0 学习之路——第六步、使用Validation模块进行服务器端数据验证
前端时间花了1个多星期的时间写了使用jQuery.Validate进行客户端验证,但是那仅仅是客户端的验证,在开发项目的过程中,客户端的信息永远是不可信的,所以我们还需要在服务器端进行服务器端的验证已 ...
- 【转】App开放接口api安全性—Token签名sign的设计与实现
前言 在app开放接口api的设计中,避免不了的就是安全性问题,因为大多数接口涉及到用户的个人信息以及一些敏感的数据,所以对这些接口需要进行身份的认证,那么这就需要用户提供一些信息,比如用户名密码等, ...
- App开放接口api安全性—Token签名sign的设计与实现
前言 在app开放接口api的设计中,避免不了的就是安全性问题,因为大多数接口涉及到用户的个人信息以及一些敏感的数据,所以对这些接口需要进行身份的认证,那么这就需要用户提供一些信息,比如用户名密码等, ...
- App开放接口API安全性之Token签名Sign的设计与实现
前言 在app开放接口api的设计中,避免不了的就是安全性问题,因为大多数接口涉及到用户的个人信息以及一些敏感的数据,所以对这些接口需要进行身份的认证,那么这就需要用户提供一些信息,比如用户名密码等, ...
- iOS使用Security.framework进行RSA 加密解密签名和验证签名
iOS 上 Security.framework为我们提供了安全方面相关的api: Security框架提供的RSA在iOS上使用的一些小结 支持的RSA keySize 大小有:512,768,10 ...
- 验证签名机制——java示例
简单的验证公钥私钥签名认证: 公钥是对外公开的部分,私钥是不公开的部分,一般在项目开发中公钥是给用户,私钥是存于服务器上,二者中有一个加密,则需要另外一个来解密. 下面是java实现的一个比较简单的示 ...
随机推荐
- PHP 类文件的自动加载机制 __autoload()
如果一个类在多个脚本中都需要使用,可以将一个类的定义代码,单独的封装到一个文件中,这种文件也叫作类文件,在需要的时候,将整个文件载入进来即可! PHP在执行的时候,如果发现需要一个类(只要是和这个类相 ...
- AsnycLocal与ThreadLocal
AsnycLocal与ThreadLocal AsnyncLocal与ThreadLocal都是存储线程上下文的变量,但是,在实际使用过程中两者又有区别主要的表现在: AsyncLocal变量可以在父 ...
- CSS-网站导航栏标题之间的分隔符
在一个网页上,尤其是导航栏文字与文字之间,大多数情况下都会有分隔符,也就是文字之间的一个小竖线,这个小小的分隔符,每个网站都有不同的样式,常用的写法就是用标签的边框,这个写法也比较简单,用起来也方便, ...
- 使用ArcGIS Runtime 100 进行本地GIS数据处理的注意事项
如下图所示,如果需要使用ArcGIS Runtime 100 进行本地GIS数据处理,则需要依赖Local Server通过发布GP服务实现. 一.ArcGIS Runtime所使用的GPK是有版本限 ...
- windows10局域网实现文件共享
1.共享文件夹设置: 磁盘文件夹,鼠标右键 选择高级共享 如图,自定义选项: 控制面板中添加新用户,一定给设置一个密码(远程登录时候用) 用户: * windows键+R * \\IP地址\目录 * ...
- go语言练习:通道、协程
1.通道的简单例子: package main import "fmt" func main() { channel:=make(chan string) //创建了一个通道对象 ...
- windows 服务器MYSQL 数据库安装配置
一.到官网下载MYSQL 打开官网地址:www.mysql.com, 选择 DOWNLOADS,进入到MySQL的下载页面,在页面的底部有一个MySQL Community Edition, 并且下面 ...
- LeetCode题解之Longest Continuous Increasing Subsequence
1.题目描述 2.问题分析 从每一个num[i]往前扫描即可. 3.代码 int findLengthOfLCIS(vector<int>& nums) { ){ return n ...
- SQL SERVER 2012/ 2014 分页,用 OFFSET,FETCH NEXT改写ROW_NUMBER的用法(转)
写法: 假装有个表Shop,其中有一列ShopName,取100000到100050条数据. ROW_NUMBER 的写法 SELECT * FROM (SELECT ShopName , ROW_N ...
- JSON教程基础
一.基础简介 二.JSON 语法 三.JSON 使用 一.基础简介 1.JSON:JavaScript 对象表示法(JavaScript Object Notation). JSON 是存储和交换文本 ...