服务器端数据合法性验证:签名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实现的一个比较简单的示 ...
随机推荐
- JAVA后端笔试试题(一)
2017年6月7日,天气晴转阴.心情还不错. 上周六参加了自己的第一场笔试,感觉很糟糕,主要是对基础知识掌握不扎实,现在把笔试中的部分问题总结归纳如下,便于以后查看. 1.GC是什么?为什么要GC? ...
- Java String 和JSON转换
Java项目中经常会使用到JSON格式和String格式的数据,所以二者之间的转换也是一个重要的步骤. Sting类型的数据.如: 转化为JSONObject的步骤如下: 1).把字符串转成 JSON ...
- Python 基于python实现的http接口自动化测试框架(含源码)
基于python实现的http+json协议接口自动化测试框架(含源码) by:授客 QQ:1033553122 欢迎加入软件性能测试交流 QQ群:7156436 由于篇幅问题,采用百度网 ...
- AndroidStudio 3.0升级之compile、implementation简要说明
1.现象 androidStudio 升级至3.0后 之前引用库所使用的complie默认变成implementation 如以下: 3.0之前 compile 'io.reactivex.rxjav ...
- svn Please execute the 'Cleanup' command. 问题解决
1由于使用svn 更新文件出错,导致svn中断,然后就一直循环出现 ‘’Please execute the 'Cleanup' command‘’ 问题: 查找网上方案 . 有使用sqlite3 ...
- PowerShell下载文件
$webRequest = [System.Net.HttpWebRequest]::Create("http://go.microsoft.com/fwlink/?LinkID=14915 ...
- 通过javascript添加一行
<html><head> <title>添加新的行</title></head><body> <div onclick=& ...
- 【爬坑】运行 Hadoop 的 MapReduce 示例卡住了
1. 问题说明 在以伪分布式模式运行 Hadoop 自带的 MapReduce 示例,卡在了 Running job ,如图所示 2. 解决过程 查看日志没得到有用的信息 再次确认配置信息没有错误信息 ...
- OpenGL超级宝典笔记——画三角形(转)
http://my.oschina.net/sweetdark/blog/161002 学习了画线的知识,我们可以使用GL_LINE_LOOP来画闭合的多边形.但是使用这种方式画出来的只有线框,多边形 ...
- xml的xsi:type序列化和反序列化
最近在做HL7V3的对接,关于XML的序列化和反序列化遇到xsi:type的问题解决方法 实体类定义: public class HL7V3_ProviderOrganization { public ...