如何设计好的restful api 设计指南之安全性

君,已阅读到文档的结尾了呢~~
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
如何设计一个好的RESTful开放API平台
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer-4.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口RESTful Api 身份认证安全性设计 - 推酷
RESTful Api 身份认证安全性设计
REST是一种软件架构风格。RESTful Api 是基于 HTTP 协议的 Api,是无状态传输。它的核心是将所有的 Api 都理解为一个网络资源。将所有的客户端和服务器的状态转移(动作)封装到 HTTP 请求的 Method &之中。
详情可以阅读
而这篇文章则主要是讨论 RESTful Api 身份认证安全性设计。
没有绝对的安全,这个话题很深, 下文都是自己的一些理解,水平有限,如有勘误,希望大家予以指正。
由于 RESTful Api 是基于 Http 协议的 Api,是无状态传输,所以
只要和用户身份有关的 请求
都会带上身份认证信息。(很多时候客户端事先并不知道某个 api 后期会不会加入身份判断,所以我们一般都会选择每个请求都会带上认证信息,如果有的话。)
Http Basic Authentication
Http Basic 是一种比较简单的身份认证方式。
在 Http header 中添加键值对 Authorization: &Basic xxx (xxx 是 username:passowrd base64 值)。
例如 username 为 zmk ,password 为 123456,请求则如下
GET /auth/basic/ HTTP/1.1
Host: xxxxx
Authorization: Basic em1rOjEyMzQ1Ng==
而Base64 的解码是非常方便的,如果不使用
,相当于是帐号密码直接暴露在请求中。
危险性高,实际开发者使用的应该几乎为0。
顺便提下 DIGEST 认证,和 BASIC 认证相差无几,而且不适合 api 设计,实际又需要两次请求,首次请求,服务器端返回401,并且带上 nonce 值,然后客户端再利用 username + password + nonce 默认MD5之后再请求。对 http 请求的作用是仅仅防止二次请求,对身份认证并没有什么提升。
Cookie + Session
不知道是否应该这么称呼,只是觉得类似于 cookie 与 session 的机制。
原理即当客户端登录完毕之后,给客户端返回一个 cookie ,服务器端控制该 session 的有效期,
每次请求都带上该值,然后服务器端做验证,退出之后,客户端通知服务端端销毁 session ,自身销毁 cookie 。但是如果抓包获取到 cookie ,就能任意伪造请求了。
危险性高,实际开发估计使用得还不少。
Api Key + Security Key + Sign
下图是我们自己每次请求的身份认证的方式,如有不足,请大家指出。可以说是 JWT 的自定义版吧。
这里的认证逻辑即:
用户登录返回一个 api_key 和 security_key ;
然后客户端将 security_key 存在客户端;
当要发送请求之前,通过 function2 加密方法,把如图所示的五个值一起加密,得到一个 sign ;
发送请求的时候,则将除去 security_key 之外的值,以及 sign 一起发送给服务器端;
服务器端首先验证时间戳是否有效,比如是服务器时间戳5分钟之前的请求视为无效;
然后根据 api_key 验证 sercurity_key ;
最后验证 sign 。
是否需要加上时间戳验证?
上面的认证逻辑中加密得到签名的时候,把时间戳加进去是为了在一定程度上屏蔽了一些无效的请求,可以略去,也可以设计的更加严格。 如果想防止恶意的 api ddos 攻击,这一步验证肯定是不行的。需要做更多的验证,比如用户验证,ip 验证等。
。它会在返回的 http 头信息里带上
X-RateLimit-Limit: 5000
X-RateLimit-Remaining: 4999
表示这个接口在某一时间段内,该授权用户调用该接口的最大次数为5000次,该时间段内还剩余4999次。当然,这样的验证加上之后,在代码的执行效率上肯定会有所影响。
是否需要将 request_parameters 也加入到 sign 生成的算法之中?
也不是必须的,仅仅是为了请求的真实性,减少请求的伪造,比如
有人抓包拿到 http 请求之后,如果没有验证 sign 这步,那么别人就可以非常简单的修改请求的参数,而请求都会生效。
血的教训,自己经历的一个实际案例:
一个取消用户喜欢的标签的接口,该接口会向服务器端发送类似于 ids=1,2,3,4 这样的 request_parameters ,然后服务器端拿到这些 id 之后切割,然后将该用户和这些标签的关系从 user_tag 表中删除。某个周末,数据库服务器报警,而依照我们用户习惯,那个时间不存在流量高峰,这个报警很不正常,正准备处理,报警结束了,但是过了一段时间就有用户反应他们喜欢的标签都被删了。
通过查询数据库的慢日志,发现有很多注入的 sql。
DELETE FROM `user_tag` WHERE uid=4385328 AND tid=1 OR 14=14;
DELETE FROM `user_tag` WHERE uid=4385328 AND tid=1 OR 91=91;
没有对切割之后的 id 没有做数字验证,估计黑客就是传的 ids=1 OR 14=14,2,3 ,而一个 delete 操作可能超时,他丫的就搞了很多次请求,真是够狠的。
幸运,数据库还有定时的打包备份,大部分用户的数据还是恢复了,同时修复了这一漏洞。
所以如果这里将 request_parameters 也加入到签名之中,就减少了伪造请求的可能性,但是无法杜绝,破坏者可能就非要黑你,又对逆向工程非常熟悉,找到我们加密算法的实现,依然可以未知出合法的签名,所以我们常说,服务器端永远不能相信客户端的请求都是安全的、合法的,需要做验证的都还是不能省略。
同时这( sign 算法)也造成了 api 接口调试的成本,api 测试工具必须也得实现那一套算法,或者是设置在开发环境下不做验证。我们在配置开发环境的时候则是 vpn 连测试服务器所在内网,然后进行测试,否则开发环境也存在被人利用的风险。
) 使用流程如下(图片来自官网)
其认证机制也是登录,发放密钥给客户端,
然后客户端每次发送请求的时候通过 JWT 的算法规则组装 JWT 的 Auth Header ,服务器端作验证。
web 授权认证的原理万变不离其宗,都是如此。
只不过 JWT 呢,自定了一套认证协议。格式为 Header . Payload . Signature 。比如 xxxxx.yyyyy.zzzzz 。签名内容是有 Header + Payload + Secret 通过 HMAC SHA256 算法加密而成。
HMACSHA256(
base64UrlEncode(header) + &.& +
base64UrlEncode(payload),
而请求的很多参数键值对都可以放在 Payload 里面。完整讲解请求看官方的介绍&
需要注意的一点 ,依照 JWT 的协议,只有一个 secret ,无法得知该用户是谁,所以在 secret 该值中必须要可以解码出用户的id。
而我们自定义认证协议的时候 header 感觉就没有必要了,使用什么算法事先定义好即可。所以我们也没选择这种方式而是上面的那种方式。
一个基于 netty 的严格的安全验证的轻量级的 RESTful Api Server
已发表评论数()
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
主题不准确
没有分页内容
图片无法显示
视频无法显示
与原文不一致深入浅出RESTful&API设计,小白也能看懂!
关于RESTful API编写指南、设计规范的文章很多,但大部分文章都没有说清楚在RESTful
API设计过程中,每种HTTP请求方法适用于何种场景,使用了这些请求方法后会对客户端和服务端产生何种影响。而有的文章写的太过专业化,让初学者很难理解。
因此,本文本着深入浅出的方法,加上图片解释的形式,为大家介绍一下RESTful
API设计过程中应该注意的细节,以及其中的设计原理,让零基础的小白用户也能理解。
什么是RESTful API ?
简单来说,RESTful API
是基于HTTP协议产生的一种相对简单的API设计方案,属于无状态传输。RESTful 的核心是 everything
is a “resource”,所有的HTTP action,都应该是相应resource上可以被操作和处理的,而API
就是对资源的管理操作,而这个具体操作是由 HTTP action 指定的。
RESTful API 是目前比较成熟的一套网络应用程序的API设计理论,RESTful API
的出现使前后端设备之间进行交互时可以按照这个设计更规范、更容易交流。
<img src="/blog7style/images/common/sg_trans.gif" real_src ="/large/0069ZL6Igw1f67be563c2j306o08xq34.jpg"
ALT="深入浅出RESTful&API设计,小白也能看懂!"
TITLE="深入浅出RESTful&API设计,小白也能看懂!" />
(注:可以把API看做服务器与客户端之间进行连接的一个接口。客户端可以从API这个入口获取、修改服务器里面的资源。)
HTTP协议语义使用方法
在一个RESTful系统里,客户端向服务端发起索取资源的操作只能通过HTTP协议语义来进行交互。最常用的HTTP协议语义有以下5个:
GET : 从服务器取出资源(一项或多项)
POST:在服务器新建一个资源
PUT:在服务器更新资源(客户端提供完整资源数据)
DELETE:从服务器删除资源
HEAD : 从服务器获取报头信息(不是资源)
一些API设计者在使用这5个HTTP协议请求方法时存在语义混用的情况,某些该用PUT请求的资源,却使用了GET。下面就简单介绍一下每个HTTP动词使用场景和对服务器产生的影响。
<img src="/blog7style/images/common/sg_trans.gif" real_src ="/large/0069ZL6Igw1f67bj8p2jjj30hs08c0tw.jpg"
ALT="深入浅出RESTful&API设计,小白也能看懂!"
TITLE="深入浅出RESTful&API设计,小白也能看懂!" />
<img src="/blog7style/images/common/sg_trans.gif" real_src ="/large/0069ZL6Igw1f67bjhrybjj30hs06y0tq.jpg"
ALT="深入浅出RESTful&API设计,小白也能看懂!"
TITLE="深入浅出RESTful&API设计,小白也能看懂!" />
<img src="/blog7style/images/common/sg_trans.gif" real_src ="/large/0069ZL6Igw1f67bjy09ntj30hs08cgmh.jpg"
ALT="深入浅出RESTful&API设计,小白也能看懂!"
TITLE="深入浅出RESTful&API设计,小白也能看懂!" />
<img src="/blog7style/images/common/sg_trans.gif" real_src ="/large/0069ZL6Igw1f67bk1k2qvj30hs08cdh5.jpg"
ALT="深入浅出RESTful&API设计,小白也能看懂!"
TITLE="深入浅出RESTful&API设计,小白也能看懂!" />
<img src="/blog7style/images/common/sg_trans.gif" real_src ="/large/0069ZL6Igw1f67bk5k3f4j30hs08c3zp.jpg"
ALT="深入浅出RESTful&API设计,小白也能看懂!"
TITLE="深入浅出RESTful&API设计,小白也能看懂!" />
【注:通常说到幂等性时,还会说安全性(只读)。GET、HEAD和OPTIONS均被认为是安全的方法,而PUT、POST、DELETE等请求都是不安全的(会修改数据)。】
WEB服务接收与返回的互联网资源类型
客户端与服务端进行交互响应时,需要规定双方能够接受何种类型的媒体表现形式,最常见的以application开头的媒体格式类型有:
application/json: JSON数据格式
application/xhtml xml:XHTML格式
application/xml: XML数据格式
application/atom xml:Atom XML聚合格式 & &
部分小白看到这儿可能就会迷糊:RESTful Api 设计与上面提到的资源类型有何关系?
我们以地下党和接头人对接的场景为例,解释下,什么是资源类型?它和API设计有何关系:
地下党A和接口人B见面,双方约定,以敲三下门作为接头暗号,暗号对了就放行。
(这里敲门、敲三下的约定就类似于RESTful
Api设计里面的“HTTP协议”,只有按照这个协议约定,合作才能继续进行。)
听到三声敲门声,双方确定是自己人。事先,双方就已经确定以何种方式与对方交流最新情报:中文?英文?粤语?这些方式必须是对方能接收并破译的形式。
(这里的中文、英文、粤语就类似于客户端和服务器交互时使用的资源类型,API设计中只有使用合理的资源类型,才能让客户端获取到可以读取的资源。)
怎么样?这么一解释,是不是通俗易懂啦!
API设计原则
URL中应尽量使用名词,尽量避免使用动词;
应该尽量将API部署在专用域名之下;
如果确定 API 很简单,不会有进一步扩展,可以考虑放在主域名下;
https://example.org/api/
应该将API 的版本号放入URL,或者将版本号放在HTTP头信息中;
路径又称"终点"(endpoint),表示API的具体网址。
在RESTful架构中,每个网址代表一种资源,所以网址中不能有动词,只能有名词,而且所用的名词往往与数据库的表格名对应。一般来说,数据库中的表都是同种记录的”集合"(collection),所以API中的名词也应该使用复数。
举例来说,有一个API提供动物园(zoo)的信息,还包括各种动物和雇员的信息,则它的路径应该设计成下面这样。
/v1/animals
/v1/employees
3、找到特定领域的媒体类型,根据特定的领域来设计媒体类型
在《RESTful Web
APIs》一书中提及到当你想要发布一个API的时候,首先要做的就是找到一个已有的特定领域特定设计。重复造轮子是没有意义的。
在数据返回格式方面,大部分的网站优先提供Xml、JSON的数据返回,Google定义的GData就是在Atom基础上作了扩展,还有一些网站提供了php的数据返回。
易拓展性:一个易拓展的API设计方案,可以让你延缓实现功能,因为“如果需要的话,后面再添加也很方便”。不需要的功能就不添加;
灵活性:API应该具有足够的灵活性来支持上层UI;
可移植性:这个API可以运行在任何操作系统上;
API应该对程序员友好,并且在浏览器地址栏容易输入;
API设计流程
<img src="/blog7style/images/common/sg_trans.gif" real_src ="/large/0069ZL6Ijw1f67bpaoqhsj30ge0hgjuq.jpg" ALT="来源于《RESTful Web APIs》一书"
TITLE="深入浅出RESTful&API设计,小白也能看懂!" />
如果你发现小编文章中有说的不对的地方,欢迎在文章下方给我们留言指正哦!
<img src="/blog7style/images/common/sg_trans.gif" real_src ="/large/0069ZL6Igw1f67bqkm2hoj30jv0fxdhi.jpg"
ALT="深入浅出RESTful&API设计,小白也能看懂!"
TITLE="深入浅出RESTful&API设计,小白也能看懂!" />
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

我要回帖

更多关于 restful api安全性 的文章

 

随机推荐