服务器端数据合法性验证:签名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实现的一个比较简单的示 ...
随机推荐
- IT的2017,面临数字生态系统新挑战,该怎么办?
所谓数字生态系统,就是包含一系列基于标准,规模可变的硬件.软件.数字设备和服务,可系统地实现企业信息数字化,数据流通,以帮助企业提高运营效率. 随着越来越多的中国企业加入数字生态系统,中国CIO在技术 ...
- Win10 开启便签快捷键
前提: Win10系统 方法: 开启便签的快捷键:windows+W 这样就可以打开便签,使用起来非常方便
- Android 经典欧美小游戏 guess who
本来是要做iOS开发的,因为一些世事无常和机缘巧合与测试工作还有安卓系统结下了不解之缘,前不久找到了guess who 源码,又加入了一些自己的元素最终完成了这个简单的小游戏. <?xml ve ...
- UWP开发细节记录:加载图像文件到D2D位图和D3D纹理
在UWP中加载文件一般先创建 StorageFile 对象,然后调用StorageFile.OpenReadAsync 方法得到一个IRandomAccessStream 接口用来读取数据: Stor ...
- windows下react-native android环境搭建注意事项
1.使用了genymotion建立模拟器(新增时模拟器时记得选网络,如下图) 与android stuido搭配使用教程:http://jingyan.baidu.com/article/915fc4 ...
- Debian 常用命令
换源 用中科大的比较快 deb http://mirrors.ustc.edu.cn/debian jessie main contrib non-free deb-src http://mirror ...
- Prometheus Node_exporter 之 Network Netstat TCP
Network Netstat TCP /proc/net/snmp 1. TCP Segments type: GraphUnit: shortLabel: Segments out (-) / i ...
- 解决MySQL5.6中的Slave延迟问题的基本教程
一.原因分析一般而言,slave相对master延迟较大,其根本原因就是slave上的复制线程没办法真正做到并发.简单说,在master上是并发模式(以InnoDB引擎为主)完成事务提交的,而在sla ...
- 转:C#综合揭秘——细说多线程(下)
原文地址:http://www.cnblogs.com/leslies2/archive/2012/02/08/2320914.html 引言 本文主要从线程的基础用法,CLR线程池当中工作者线程与I ...
- python被游标坑了
为了方便,这次就不单独写脚本了,直接一步一步执行下来就好了先说下游标,就是一个指针,比如我有1234每条占一行,那么初始游标默认是在1的位置,当read(1)后,游标自动向下next,现在指在2的位置 ...