由于server端和client端需要通信,所以api的安全性需要保证

1.完全开放的

一般只是查询,不能执行增、删、改的操作

裸奔的

<?php
public function getGoodsList($params)
{
$where = [
'cat_id'=>$params['cat_id']
];
$goods = M('Goods')->where($where)->select();
return json_encode($goods);
}

2.参数加密

参数按照规则生成sign

<?php
public function getUserInfo($params, $appKey, $sign)
{$currentSign = $this->getSign($appKey, $params);
if($sign !== $currentSign) {
return "签名不合法";
}
$where = ['id'=>$params['id']];
$user = M('User')->where($where)->select();
return json_encode($user);
}

3.参数加密+时效性验证

<?php

public function getUserInfo($params, $appKey, $sign, $timestamp)
{
//判断请求是否过期---假设过期时间是20秒
$request_time = getDateTimeByTicks($timestamp);
if(($request_time + 20) < $_SERVER["REQUEST_TIME"]) {
return "接口过期";
} $currentSign = $this->getSign($appKey, $params); if($sign !== $currentSign) {
return "签名不合法";
} $where = [
'id'=>$params['id']
];
$user = M('User')->where($where)->select();
return json_encode($user);
}

4.参数加密+时效性验证+私钥

<?php
public function updateUserInfo($params, $appKey, $sign, $timestamp)
{ $requestTime = getDateTimeByTicks($timestamp);
if(($requestTime + 20) < $_SERVER["REQUEST_TIME"]) {
return "接口过期";
} // 根据appkey查库获取appSecret值
$appSecret = M('Setting')->where(['appKey'=> $appKey])->getField('appSecret'); //检验签名是否合法
$currentSign = $this->getSign($appKey, $appSecret, $params); if($sign !== $currentSign) {
return "签名不合法";
} $where = ['id'=>$params['id']];
unset($params['id']);
$data = M('User')->where($where)->save($params);
return json_encode($data);
}

5.参数加密+时效性验证+私钥+Https

为了提高安全性,再增加https的双向验证模式

生成签名的方法:

  (1)对除签名外的所有请求参数按key做生序排列

     如:age=18,name=123,timestamp=123456

  (2)把参数名和参数值连接成字符串 
     如:age18_name123_timestamp123456

  (3)用申请到的appkey连接到拼装字符串头部和尾部,然后进行32位MD5加密,将到得MD5加密摘要转化成大写

    如:appkey='bb',md5('bbage18_name123_timestamp123456bb')

      sign='3FFDD2399A23FB7B5D6D99AA84F9A6E3'

服务端API安全解决方案的更多相关文章

  1. .Net分布式异常报警系统-客户端及服务端API

    客户端 客户端的作用就是捕获未处理异常, 发送异常到服务端. 关于捕获未处理异常的方法参考 http://www.cnblogs.com/youring2/archive/2012/04/25/246 ...

  2. 安卓推送——个推服务端api使用误区

    首先你需要在个推开放着平台上注册你的应用,以及获得以下几个必要的值APPID |APPKEY | MASTERSECRET,本文假设你已经完成上述步骤以及完成客户端SDK的集成. 原理 个推服务端ap ...

  3. Identity4实现服务端+api资源控制+客户端请求

    准备写一些关于Identity4相关的东西,最近也比较对这方面感兴趣.所有做个开篇笔记记录一下,以便督促自己下一个技术方案方向 已经写好的入门级别Identity4的服务+api资源访问控制和简单的客 ...

  4. JAVA通过http访问其他服务端API

    项目要实现这么一个功能,用户通过点击按钮,通过axios来访问python的API(算法,java不好做)得到一个结果存储到数据库并且返回到页面. 但是python不是在tomcat上面运行的,所以不 ...

  5. 服务端API 工作经验(没有工作的是体会不到的)

    1.慢慢了解以下内容 [{xx:xxx,xx:xxx},{xx:xxx,xx:xxx},{xx:xxx,xx:xxx},]-- 数据 data 服务端API 状态代码(01代表成功) message ...

  6. CMDB学习之五服务端api

    服务端api 对发送来的数据进行处理,并返回结果,首先要创建一个Django项目 第一步,就是写URL路由在分支中写url api 主路由 from django.conf.urls import u ...

  7. C#开发BIMFACE系列6 服务端API之获取文件信息

    在<C#开发BIMFACE系列4 服务端API之源上传文件>.<C#开发BIMFACE系列5 服务端API之文件直传>两篇文章中详细介绍了如何将本地文件上传到BIMFACE服务 ...

  8. C#开发BIMFACE系列4 服务端API之源上传文件

    在注册成为BIMFACE的应用开发者后,要能在浏览器里浏览你的模型或者获取你模型内的BIM数据, 首先需要把你的模型文件上传到BIMFACE.根据不同场景,BIMFACE提供了丰富的文件相关的接口. ...

  9. C#开发BIMFACE系列3 服务端API之获取应用访问凭证AccessToken

    系列目录     [已更新最新开发文章,点击查看详细] BIMFACE 平台为开发者提供了大量的服务器端 API 与 JavaScript API,用于二次开发 BIM 的相关应用. BIMFACE ...

随机推荐

  1. python使用selenium

    首先安装 pip install selenium 测试抓取baidu,其中的chromedriver.exe需要自己下载,百度有很多的 import timefrom selenium import ...

  2. C语言 · 比较字符串

    算法训练 比较字符串   时间限制:1.0s   内存限制:512.0MB      编程实现两个字符串s1和s2的字典序比较.(保证每一个字符串不是另一个的前缀,且长度在100以内).若s1和s2相 ...

  3. MT29F8G08ABACA nandflash 参数记录

    跟踪 MT29F8G08ABACA datasheet ,记录里面有关软件的参数 首先,硬件上的特征,page size , oob , block size [](http://images2017 ...

  4. 简单的Http请求数据保存到Hdfs

    使用okhttp工具集来开发:(如果文件已经存在会报错) package com.etl; import java.io.IOException; import org.apache.commons. ...

  5. oozie 运行demo

    昨晚装好了oozie,能启动了,并且配置了mysql作为数据库,好了,今天要执行oozie自带的demo了,好家伙,一执行就报错!报错很多,就不一一列举了,就说我最后解决的方法吧. oozie job ...

  6. Redis列表

    Redis列表是简单的字符串列表,排序插入顺序.您可以在头部或列表的尾部Redis的列表添加元素. 列表的最大长度为232 – 1 (每个列表超过4十亿元素4294967295)元素. 例子 redi ...

  7. jquery 利用CSS 控制打印样式

    一.添加打印样式 1. 为屏幕显示和打印分别准备一个css文件,如下所示:  用于屏幕显示的css: <link rel="stylesheet" href="cs ...

  8. C++中,int a = 10的后面的操作

    在C++中,int a = 10的内存表现形式取决于你的具体代码和优化级别,主要的几种形式: 不存在于内存中.比如a从未改变,被编译器当成常量,所有代码中的a直接替换成10: 存在于寄存器中:比如对a ...

  9. linux下udev简介

    一.关于Udev u即user space,dev是device,通过它的名字,我们就可以简单了解到,它是一个和用户态相关的驱动设备管理机制.udev是一个针对2.6内核的文件系统.提供一种基于用户空 ...

  10. 在kali linux之下 下载并解压的文件名呈现乱码 解决方案

    从Linux往 windows拷贝文件或者从windows往Linux拷贝文件,有时会出现中文文件名乱码的情况,出现这种问题的原因是因为,windows的文件名中文编码默认为GBK,而Linux中默认 ...