有时候,你也许会想:

我写的接口,那别人要是知道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原理的更多相关文章

  1. 【接口安全】接口合法性验证加密验签SIGN 签名规则

    在对接API接口时,接口地址和参数结构都很容易被黑客抓包,从而模拟发送请求. 考虑到安全性,防止别人冒名调用,要对接口请求进行合法性验证. 基本原理如下 双方约定 APPID:参与签名和网络传输 AP ...

  2. 微信支付java版V3验证数据合法性

    [TOC] 1. 微信支付java版V3验证数据合法性 概要:使用微信支付接口时,微信会返回或回调给商户XML数据,开发者需要验证微信返回的数据是否合法. 特别提醒:商户系统对于支付结果通知的内容一定 ...

  3. MVC5 + EF6 + Bootstrap3 (15) 应用ModelState和Data Annotation做服务器端数据验证

    Slark.NET-博客园 http://www.cnblogs.com/slark/p/mvc5-ef6-bs3-get-started-server-side-validation.html 系列 ...

  4. 微软企业库5.0 学习之路——第六步、使用Validation模块进行服务器端数据验证

    前端时间花了1个多星期的时间写了使用jQuery.Validate进行客户端验证,但是那仅仅是客户端的验证,在开发项目的过程中,客户端的信息永远是不可信的,所以我们还需要在服务器端进行服务器端的验证已 ...

  5. 【转】App开放接口api安全性—Token签名sign的设计与实现

    前言 在app开放接口api的设计中,避免不了的就是安全性问题,因为大多数接口涉及到用户的个人信息以及一些敏感的数据,所以对这些接口需要进行身份的认证,那么这就需要用户提供一些信息,比如用户名密码等, ...

  6. App开放接口api安全性—Token签名sign的设计与实现

    前言 在app开放接口api的设计中,避免不了的就是安全性问题,因为大多数接口涉及到用户的个人信息以及一些敏感的数据,所以对这些接口需要进行身份的认证,那么这就需要用户提供一些信息,比如用户名密码等, ...

  7. App开放接口API安全性之Token签名Sign的设计与实现

    前言 在app开放接口api的设计中,避免不了的就是安全性问题,因为大多数接口涉及到用户的个人信息以及一些敏感的数据,所以对这些接口需要进行身份的认证,那么这就需要用户提供一些信息,比如用户名密码等, ...

  8. iOS使用Security.framework进行RSA 加密解密签名和验证签名

    iOS 上 Security.framework为我们提供了安全方面相关的api: Security框架提供的RSA在iOS上使用的一些小结 支持的RSA keySize 大小有:512,768,10 ...

  9. 验证签名机制——java示例

    简单的验证公钥私钥签名认证: 公钥是对外公开的部分,私钥是不公开的部分,一般在项目开发中公钥是给用户,私钥是存于服务器上,二者中有一个加密,则需要另外一个来解密. 下面是java实现的一个比较简单的示 ...

随机推荐

  1. Oracle中Merge的使用

    MERGE INTO products p USING product_changes pc ON (p.product_id = pc.product_id) WHEN MATCHED THEN - ...

  2. php递归获取无限分类菜单

    从数据库获取所有菜单信息,需要根据id,pid字段获取主菜单及其子菜单,以及子菜单下的子菜单,可以通过函数递归来实现. <?php class Menu { public $menu = arr ...

  3. css实现3D立方体旋转特效

    先来看运行后出来的效果 它是在不停运行的一个立方体 先来看html部分的代码 <div class="rect-wrap"> <!--舞台元素,设置perspec ...

  4. Python 3前言

    Python具有简单.易学.免费.开源.可移植.可扩展.可嵌入.面向对象等优点,它的面向对象甚至比java和C#.net更彻底. 作为一种通用语言,Python几乎可以用在任何领域和场合,角色几乎是无 ...

  5. 优化EF Code First第一次请求速度

    由于EF Code First模式没有模型文件,所以很多一次请求的时候速度比较慢,EF需要将对应的数据库映射关系加载到内存里面,往后请求就比较快.可以通过在程序初始化的时候增加一段代码来优化EF第一次 ...

  6. T-SQL查询两个日期之间的休息日(周六周日)天数

    SELECT COUNT(*) FROM MASTER..SPT_VALUES WHERE TYPE = 'P' AND DATEADD(DAY,NUMBER,'2014-03-13')<='2 ...

  7. 在Eclipse中运行Jboss时出现java.lang.OutOfMemoryError:PermGen space及其解决方法

    在Eclipse中运行Jboss时出现java.lang.OutOfMemoryError:PermGen space及其解决方法 在Eclipse中运行Jboss时,时间太长可能有时候会出现java ...

  8. 176条DevOps人员常用的linux命令速查表

      线上查询及帮助命令 文件和目录操作命令 查看文件及内容处理命令 文件压缩及解压缩命令 信息显示命令 搜索文件命令 用户管理命令 基础网络操作命令 深入网络操作命令 有关磁盘与文件系统的命令 系统权 ...

  9. 【转】Java学习---解析Java Servlet工作过程

    [原文]https://www.toutiao.com/i6594316694657696264/ 解析Java Servlet工作过程 Servlet简介 Servlet是sun公司提供的一门用于开 ...

  10. Windows 7 任务栏图标消失(变透明,仍然占有地方,但是点击无反应)的解决方法

    解决方案:清理资源管理器缓存(重启资源管理器) 1.打开程序管理器(ctrl+shift+esc) 2.在进程那里找到"explorer.exe",然后按结束进程 3.然后在文件( ...