HTML5技术

干货来袭-整套完整安全的API接口解决方案 - hubro

字号+ 作者:H5之家 来源:H5之家 2017-01-05 17:00 我要评论( )

在各种手机APP泛滥的现在,背后都有同样泛滥的API接口在支撑,其中鱼龙混杂,直接裸奔的WEB API大量存在,安全性令人堪优 在以前WEB API概念没有很普及的时候,都采用自已定义的接口和结构,对于公开访问的接口,专业点的都会做下安全验证,数据签名之类 反而现在,谁

在各种手机APP泛滥的现在,背后都有同样泛滥的API接口在支撑,其中鱼龙混杂,直接裸奔的WEB API大量存在,安全性令人堪优

在以前WEB API概念没有很普及的时候,都采用自已定义的接口和结构,对于公开访问的接口,专业点的都会做下安全验证,数据签名之类

反而现在,谁都可以用WEB API估接口,安全性早忘一边了,特别是外包小公司的APP项目,80%都有安全漏洞(面试了大半年APP开发得出的结论)

特在过年之前,整理了下在用的解决方案,本方案解决了

正文

数据结构

对于一个接口,返回的内容除了要返回业务数据外,还得返回处理状态,并且这个状态是在每个接口都得有

所以数据格式都会定义为:

数据头(描述数据信息)

-----------------------------------

数据体(具体数据)

本文定义结构为

处理结果 DealResult { 处理结果 Result { get; set; } 消息 Message { get; set; } 关联数据 Data { get; set; } }

View Code

所有接口都返回此对象,会描述本次请求的状态,和对应的数据,服务端则根据实际情况,返回处理结果和对应的数据

 

数据安全

开方式接口安全性就不用多说了,解决方法为加密,或数据签名验证,本文方案为进行数据签名

同返回的数据一样,提交到服务器的数据格式也统一约定,定义一个数据头基类

参数基类 /// </summary> [Serializable] public class ParameBase { ); 时间 格式 yyyy-MM-dd hh:mm:ss Time { get { return time; } set { time = value; } } 来源网站 = 1, IOS = 2,Android = 3, 微信 = 4 SourceFrom { get; set; } 签名 Token { get; set; } }

View Code

 

一个登录对象表示为

登录 Login : ParameBase { 用户名 Name { get; set; } 密码 Password { get; set; } }

View Code

数据签名表示为(KEY稍后讲到)

Token=MD5(属性值1+值2....+KEY)

按此对象表示为 MD5(Name+PassWord+Source+Time+KEY)

如果是GET参数怎么办,一样,按参数名计算,同时传递的参数要附带上Source,Time,Token 

 

密钥机制

有的喜欢把密钥放在客户端,或固定密钥,显然都有安全问题,解决方法是动态获取

这就意味着在设计接口时,有一个接口是首先要调用的,让服务器返回密钥,于是就有了登录的概念

过程表示为

登录>返回用户信息和密钥=>存储用户信息和密钥=>使用密钥调用其它接口

这样只有登录者和服务器才知道自已的密钥了

综上所述,数据结构表示为

客户端提交结构为 ParameBase(附带签名信息)

服务端返回结构为 DealResult

 

登录机制

同网页请求一样,怎么知道多次调用是同一个人呢,这里采用了COOKIE的形式,登录后服务端返回一个COOKIE,客户端再请求时带上这个COOKIE

服务端需要存储这个COOKIE标识,所有的验证处理都会基于此标识来判断用户

 

有了上面基础,进入项目阶段

WEB API项目

其实用什么项目类型都行,只是WEB API方便了对象结构序列化和传参

默认WEB API路由RESUFUL形式,没有控制器方法,只能按METHOD来定义,很不方便,改成控制器的形式,这样就能用方法名来访问了

更改路由配置为

config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{action}/{id}",//加上路由ACTION参数 defaults: new { id = RouteParameter.Optional } );

在此文,数据分为请求和返回,以登录返回用户信息为例,登录为请求,用户信息为返回,示例对象结构为

用户对象

登录返回用户 User { 用户编号 Id { get; set; } 名称 Name { get; set; } 本次登录的KEY Key { get; set; } 本资登录的凭证 Voucher { get; set; } }

View Code

 

请求方式

这里只采用了GET,POST两种方式,根据实际情况定义,控制器方法一定需要都标明,不然会出现路由BUG

定义登录方法

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • 【干货分享】通用工具类 - Orson

    【干货分享】通用工具类 - Orson

    2016-12-23 13:00

  • 随便记的一些有趣的干货的地址 - 伍三思

    随便记的一些有趣的干货的地址 - 伍三思

    2016-10-25 12:00

  • 【干货】JS版汉字与拼音互转终极方案,附简单的JS拼音输入法 - 我是小茗同学

    【干货】JS版汉字与拼音互转终极方案,附简单的JS拼音输入法 - 我是

    2016-10-19 18:00

  • 【绝对干货】仿微信QQ设置图形头像裁剪,让你的App从此炫起来~ - 南尘

    【绝对干货】仿微信QQ设置图形头像裁剪,让你的App从此炫起来~ - 南

    2016-10-17 10:00

网友点评