有时候,你也许会想:

我写的接口,那别人要是知道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. python的小数据池 is和== 以及再谈编码

    ---恢复内容开始--- 1. 小数据池, id() 小数据池针对的是: int, str, bool 在py文件中几乎所有的字符串都会缓存. id() 查看变量的内存地址 # a = 10 # b ...

  2. 有关正则表达式的Js方法(replace)

    整理一下最近常用的几个有关正则的js方法 replace 语法:stringObject.replace(regexp/substr,replacement) 用法1 const str='abc13 ...

  3. List常用几种方式

    第一种,匹配俩个集合中相同的值 , , , , , , }; , , , , , , , , }; var C= listA.Intersect(listB); foreach (var item i ...

  4. 学习笔记(2)——实验室集群LVS配置

    查看管理结点mgt的网卡信息,为mgt设置VIP [root@mgt ~]# ifconfig eth0 Link encap:Ethernet HWaddr 5C:F3:FC:E9:: inet a ...

  5. 安卓基础之Sqlite数据库最最基础操作

    Sqlite数据库基础操作 摘要:在应用中新建一个数据库,并创建一个数据表写入数据,然后读取表中数据并展示. 主要逻辑: 1.通过继承SQLiteOpenHelper自定义类,定制数据库的表结构,初始 ...

  6. Django 自定义表

    1.Django自带的用户表 create table auth_user ( id int auto_increment primary key, password varchar(128) not ...

  7. 【LLVM笔记】0x00 初识LLVM 链接类型

    模块结构 LLVM程序是由若干的模块(Module)组成,每个模块中包含有一些函数.全局变量和符号表. 这些模块可能由LLVM的连接器组合在一起,组合的过程将会整合这些函数和全局变量的定义,整合他们的 ...

  8. SQLSERVER中的LOB页面简单研究

    SQLSERVER中的LOB页面简单研究 这篇文章和我另一篇文章是相辅相成的,在看<SQLSERVER2012 列存储索引的简单研究和测试>这篇文章之前希望大家先看一下这篇文章o(∩_∩) ...

  9. webservice安全性浅谈

    原文地址:http://www.cnblogs.com/chhuic/archive/2009/11/19/1606109.html 做项目时,经常会用到WebService来通讯,但WebServi ...

  10. orcle 如何快速插入百万千万条数据

    有时候做实验测试数据用到大量数据时可以用以下方法插入: 方法一:使用xmltable create table bqh8 as select rownum as id from xmltable('1 ...