0x01 REST API 简介

REST的全称是REpresentational State Transfer,表示表述性无状态传输,无需session,所以每次请求都得带上身份认证信息。rest是基于http协议的,也是无状态的。只是一 种架构方式,所以它的安全特性都需我们自己实现,没有现成的。建议所有的请求都通过https协议发送。RESTful web services 概念的核心就是“资源”。 资源可以用 URI 来表示。客户端使用 HTTP 协议定义的方法来发送请求到这些 URIs,当然可能会导致这些被访问的”资源“状态的改变。HTTP请求对应关系如下:

对于请求的数据一般用json或者xml形式来表示,推荐使用json。

0x02 身份认证

身份认证包含很多种,有HTTP Basic,HTTP Digest,API KEY,Oauth,JWK等方式,下面简单讲解下:

2.1 HTTP Basic

REST由于是无状态的传输,所以每一次请求都得带上身份认证信息,身份认证的方式,身份认证的方式有很多种,第一种便是http basic,这种方式在客户端要求简单,在服务端实现也非常简单,只需简单配置apache等web服务器即可实现,所以对于简单的服务来说还是挺方便 的。但是这种方式安全性较低,就是简单的将用户名和密码base64编码放到header中。

正是因为是简单的base64编码存储,切记切记在这种方式下一定得注意使用ssl,不然就是裸奔了。

在某些产品中也是基于这种类似方式,只是没有使用apache的basic机制,而是自己写了认证框架,原理还是一样的,在一次请求中base64 解码Authorization字段,再和认证信息做校验。很显然这种方式有问题,认证信息相当于明文传输,另外也没有防暴力破解功能。

2.2 API KEY

API Key就是经过用户身份认证之后服务端给客户端分配一个API Key,类似:http://example.com/api?key=dfkaj134,一般的处理流程如下:

一个简单的设计示例如下:

client端:

server端:

client端向服务端注册,服务端给客户端发送响应的api_key以及security_key,注意保存不要泄露,然后客户端根据 api_key,secrity_key,timestrap,rest_uri采用hmacsha256算法得到一个hash值sign,构造途中的 url发送给服务端。

服务端收到该请求后,首先验证api_key,是否存在,存在则获取该api_key的security_key,接着验证timestrap是否 超过时间限制,可依据系统成而定,这样就防止了部分重放攻击,途中的rest_api是从url获取的为/rest/v1/interface /eth0,最后计算sign值,完之后和url中的sign值做校验。这样的设计就防止了数据被篡改。

通过这种API Key的设计方式加了时间戳防止了部分重放,加了校验,防止了数据被篡改,同时避免了传输用户名和密码,当然了也会有一定的开销。

2.3 Oauth1.0a或者Oauth2

OAuth协议适用于为外部应用授权访问本站资源的情况。其中的加密机制与HTTP Digest身份认证相比,安全性更高。使用和配置都比较复杂,这里就不涉及了。

2.4 JWT

JWT 是JSON Web Token,用于发送可通过数字签名和认证的东西,它包含一个紧凑的,URL安全的JSON对象,服务端可通过解析该值来验证是否有操作权限,是否过期等 安全性检查。由于其紧凑的特点,可放在url中或者 HTTP Authorization头中,具体的算法就如下图

0x03 授权

身份认证之后就是授权,根据不同的身份,授予不同的访问权限。比如admin用户,普通用户,auditor用户都是不同的身份。简单的示例:

1
2
3
4
5
6
7
8
9
10
$roles = array(
'ADMIN'=>array(
'permit'=>array('/^((\/system\/(clouds|device)$/'), // 允许访问哪些URL的正则表达式
'deny'=>array('/^(\/system\/audit)$/') // 禁止访问哪些URL的正则表达式
),
'AUDIT'=>array(
'permit'=>array('/^(\/system\/audit)$/'),//允许访问的URL正则表达式
'deny'=>array('/^((\/system\/(clouds|device).*)$/')
)
);

上述是垂直权限的处理,如果遇到了平行权限的问题,如用户A获取用户B的身份信息或者更改其他用户信息,对于这些敏感数据接口都需要加上对用户的判断,这一步一般都在具体的逻辑实现中实现。

0x04 URL过滤

在进入逻辑处理之前,加入对URL的参数过滤,如/site/{num}/policy 限定num位置为整数等,如果不是参数则直接返回非法参数,设定一个url清单,不在不在url清单中的请求直接拒绝,这样能防止开发中的api泄露。 rest api接口一般会用到GET,POST,PUT,DELETE,未实现的方法则直接返回方法不允许,对于POST,PUT方法的数据采用json格式,并 且在进入逻辑前验证是否json,不合法返回json格式错误。

0x05 重要功能加密传输

第一步推荐SSL加密传输,同时对于系统中重要的功能做加密传输,如证书,一些数据,配置的备份功能,同时还得确保具备相应的权限,这一步会在授权中涉及。

0x06 速率限制

请求速率限制,根据api_key或者用户来判断某段时间的请求次数,将该数据更新到内存数据库(redis,memcached),达到最大数即 不接受该用户的请求,同时这样还可以利用到内存数据库key在特定时间自动过期的特性。在php中可以使用APC,Alternative PHP Cache (APC) 是一个开放自由的PHP opcode 缓存。它的目标是提供一个自由、 开放,和健全的框架用于缓存和优化PHP的中间代码。在返回时设置X-Rate-Limit-Reset:当前时间段剩余秒数,APC的示例代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
Route::filter('api.limit', function()
{
$key = sprintf('api:%s', Auth::user()->api_key);
// Create the key if it doesn't exist
Cache::add($key, 0, 60);
// Increment by 1
$count = Cache::increment($key);
// Fail if hourly requests exceeded
if ($count > Config::get('api.requests_per_hour'))
{
App::abort(403, 'Hourly request limit exceeded');
}
});

0x07 错误处理

对于非法的,导致系统出错的等请求都进行记录,一些重要的操作,如登录,注册等都通过日志接口输出展示。有一个统一的出错接口,对于400系列和500系列的错误都有相应的错误码和相关消息提示,如401:未授权;403:已经鉴权,但是没有相应权限。如不识别的url:{"result":"Invalid URL!"},错误的请求参数{"result":"json format error"},不允许的方法:{"result":"Method Not Allowed"},非法参数等。上面所说的都是单状态码,同时还有多状态码,表示部分成功,部分字符非法等。示例如下:

0x08 重要ID不透明处理

在系统一些敏感功能上,比如/user/1123 可获取id=1123用户的信息,为了防止字典遍历攻击,可对id进行url62或者uuid处理,这样处理的id是唯一的,并且还是字符安全的。

0x09 其他注意事项

(1)请求数据,对于POST,DELETE方法中的数据都采用json格式,当然不是说rest架构不支持xml,由于xml太不好解析,对于大 部分的应用json已经足够,近一些的趋势也是json越来越流行,并且json格式也不会有xml的一些安全问题,如xxe。使用json格式目前能防 止扫描器自动扫描。

(2)返回数据统一编码格式,统一返回类型,如Content-Type: application/json; charset="UTF-8"

(3)在逻辑实现中,json解码之后进行参数验证或者转义操作,第一步json格式验证,第二步具体参数验证基本上能防止大部分的注入问题了。

(4)在传输过程中,采用SSL保证传输安全。

(5)存储安全,重要信息加密存储,如认证信息hash保存。

总之,尽量使用SSL。

REFER:
http://blog.nsfocus.net/rest-api-design-safety/
http://drops.wooyun.org/web/9737

REST API 安全设计指南相关推荐

  1. PayPal API风格指南和设计模式

    PayPal通过RESTful API将自己的平台打造成彼此连接的服务.他们为此提供了用于创建和使用这些API的指南和设计模式,其他开发者可以在自己的项目中使用这些指南和模式. \\ PayPal的A ...

  2. 谷歌地球API开发者指南(高级)

    谷歌地球API开发者指南(高级) 作者感慨:Google Earth真是一个好东东,而其爱好者更是天才啊.我们与老美在科技上的差距,不是我们以环境.资源为代价的粗放式快速增长的GDP所能掩盖的 Goo ...

  3. 百度地图API开发指南

    百度地图API开发指南 本文为百度地图API官方版本的开发指南,供各位51CTO的网友进行参考. 简介什么是百度地图API? 百度地图API是一套由JavaScript语言编写的应用程序接口,它能够帮 ...

  4. RESTful API 设计指南[转]

    一种软件架构风格.设计风格,而不是标准,只是提供了一组设计原则和约束条件.它主要用于客户端和服务器交互类的软件.基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制. RESTful AP ...

  5. 组件接口(API)设计指南-文件夹

    组件接口(API)设计指南-文件夹 组件接口(API)设计指南[1]-要考虑的问题 组件接口(API)设计指南[2]-类接口(class interface) 组件接口(API)设计指南[3]-托付( ...

  6. RESTful API 设计指南 (转)

    RESTful API 设计指南 2016-02-23 ImportNew (点击上方公号,可快速关注) 作者:阮一峰 链接:http://www.ruanyifeng.com/blog/2014/0 ...

  7. API安全(二):API安全设计原则

    很多API安全问题产生的根源是缺少好的API安全设计,做好API安全设计有利于提升API自身的安全性.这里讲2条设计原则:5A原则和纵深防御原则. 一.5A原则 5A原则由5个首字母为A的单词构成:A ...

  8. Flink入门——DataSet Api编程指南

    简介: Flink入门--DataSet Api编程指南 Apache Flink 是一个兼顾高吞吐.低延迟.高性能的分布式处理框架.在实时计算崛起的今天,Flink正在飞速发展.由于性能的优势和兼顾 ...

  9. 百度地图api开发详解(android版).pdf,百度地图API开发指南原版.pdf

    百度地图API开发指南原版 百度地图 API 开发指南 百度地图 API 开发指南 目录 简介 3 什么是百度地图 API 3 面向的读者 3 获取 API 3 开发移动平台上的地图应用 3 兼容性 ...

最新文章

  1. 乐观锁和悲观锁的区别(最全面的分析)
  2. 春运又在路上了,火车购票、出行指南了解一下!
  3. java并发编程之美-阅读记录11
  4. JAXB和java.util.Map
  5. ASP.NET Web API 中的属性路由
  6. C#LeetCode刷题之#682-棒球比赛(Baseball Game)
  7. 【华为大咖分享】1.云上开发,代码托管只是第一步(后附PPT下载地址)
  8. 高级I/O复用技术:Epoll的使用及一个完整的C实例
  9. 猫途鹰(tripadvisor.cn/)美国地区的酒店、景点、餐厅数据(82万条)
  10. 如何把word ppt 思维导图这类文件转化为高清晰度的图片(要干货只看粗体黑字)...
  11. 企业微信客户端web页面调试
  12. 用python处理mp4与gif格式互转,简单到爆!
  13. python替换所有标点符号_python 把标点符号替换为空
  14. python汇率换算程序_Python编写一个汇率兑换程序
  15. 九龙证券|近50亿资金抢筹券商龙头,知名游资杀入热门互联网股
  16. 双机热备_磁盘阵列柜
  17. bind()函数介绍
  18. RBM-MHC: A Semi-Supervised Machine-LearningMethod for Sample-Specific Prediction of AntigenPresent
  19. 开源一套易语言网络验证源码
  20. SQS (Simple Queue Service)简介

热门文章

  1. 《数学之美》第5章 隐含马尔可夫模型
  2. windows安装visual studio code并配置latex并编写latex论文
  3. A股光刻胶飙涨背后:仅一家可供应高端光刻胶
  4. 任正非深度剖析技术差距:我们为何憎恨化学?
  5. 欧阳自远:有个性的嫦娥12345,如何不重复美国探月路?
  6. 搞基础理论研究有什么用?
  7. 麻省理工最新报告:完全无人驾驶仍需10年
  8. Science公布:全世界最前沿的125个科学问题
  9. 偏见与人类大脑结构有关
  10. 这些重大科技领域问题,听听专家怎么说