资讯专栏INFORMATION COLUMN

HTTP API 设计入坑指南(二)

pingan8787 / 1184人阅读

摘要:而只需要服务端生成,客户端保存,每次请求在头部中使用携带,服务端认证解析就可。如果缓存不清理,验证码就会一直有效,不安全。

一、授权

参考文献:https://blog.risingstack.com/...

1. Basic authentication (最简单,适用于没有第三方的请求接口中)

客户端发送authorization,内容为 Basic Base64编码(username:password),用户名和密码没有加密

缺点:每个请求都要带用户名和密码,不安全

2. Cookies

Session:用户登录成功,服务端返回一个sessionID,客户端将其存在cookie中,每次请求都会带这个sessionID

HTTP Only:(config/session.php中设置)如果是true,JS代码将无法读取cookie信息,拿不到document.cookies。从而防止XSS攻击,增加了cookie的安全性,但即便如此,也不要将重要信息存入cookie

3. Single Key :双方约定唯一标示 4. Tokens

4.1 JWT:Json Web Token

参考文献:https://www.jianshu.com/p/af8...;
用户完成登录之后,每个请求都会包含JWT,用来验证用户身份和访问权限

构成:

Header头部包括Token类型和加密算法,并base64加密

Payload负载 存放有效信息,并base64加密

Signature签名 包括Header、Payload、Secret秘钥(Secret保存在服务端的,服务端会根据这个密钥进行生成token和验证,所以需要保护好)

三部分用.连接,生成完整的token

cookie+session通常是保存在内存中,而且服务从单服务到多服务会面临的session共享问题,随着用户量的增多,开销就会越大。而JWT只需要服务端生成token,客户端保存token,每次请求在头部authorization中使用Bearer携带token,服务端认证解析就可。

因为JWT不使用cookie,所以支持跨域

因为json的通用性,所以支持跨语言

4.2 Self-Tokens

根据业务,自己写生成token的逻辑,注意设定请求次数和过期时间

5. Signatures

API的使用者和提供者拥有同样的私钥,才能操作业务

算法如下:
对参数进行字典升序排列,防止顺序不同,生成的签名不同
排序后进行字符串连接
app-secret为后缀,进行加密,再转大写

案例:

http://wiki.open.qq.com/wiki/...

https://www.cnblogs.com/dcb36...

https://help.aliyun.com/docum...

https://cloud.tencent.com/doc...

https://docs.gdax.com/#creati...

http://dev.netease.im/docs/pr...

6. One-Time Passwords(OTP)一次性密码

Time-based One-time Password Algorithm 基于时间
HMAC-based One-time Password Algorithm 基于计数器

感觉QQ安全中心就是这个原理,更多内容参考

https://www.jianshu.com/p/a7b...

http://www.cnblogs.com/voipma...

7. Oauth2

Oauth2相当于第三方,在客户端和服务端之间多设置了一层,用户给客户端授权,客户端向第三方认证申请token,申请成功后使用token向服务端申请资源

参考文献:

http://www.ruanyifeng.com/blo...

https://oauth.net/2/

https://helpx.adobe.com/coldf...

二、安全 1. 请求

不信任任何输入数据
校验数据格式:len,range,format,type
拒绝无效、非法内容
使用通用校验类库,不要自己造轮子
拒绝过大请求数据
记录失败次数,黑名单
验证码:清理session
登录时访问一个脚本文件,用来生成验证码,将值保存在Session中,提交时判断输入值与session是否一致。如果缓存不清理,验证码就会一直有效,不安全。
保存时可以用session::flash,访问一次之后就会被删除,解决清理缓存的问题

2. 超范围读取数据 =》逻辑错误 3. 异常信息 =》敏感信息 4. 频率

X-RateLimit-Limit
X-RateLimit-Remaining
Retry-After
X-RateLimit-Reset

5. 安全连接(禁止跳过验证)=》HTTPS

HTTP:最普遍的一种网络协议,以明文方式发送内容,不适合传输一些敏感信息

HTTPS:HTTP的安全版,在HTTP基础上加了SSL协议,SSL依靠证书验证服务器身份,为客户端和服务端的通信加密
作用一:建立数据传输的安全通道
作用二:确认网站的真实性
缺点:费用高,速度慢,流量成本大

区别:

HTTPS需要申请证书、

HTTPS数据加密,安全性高、

HTTP端口是80,HTTPS是443

6. 数据RSA加密

支付场景 https://docs.open.alipay.com/...

7. XSS

参考文献:http://laravelacademy.org/pos...
注入恶意JS代码,解决方案是用 htmlentities()转义数据

laravel的blade模板引擎已经帮我们处理好了

{!!$data !!} 会原生输出HTML,适用于图片、链接
{{ $data  }} 会对数据进行转义,从而避免XSS攻击。

如果需要更强大的过滤HTML功能,可以使用HTML Purifier库

8. SQL注入

注入恶意SQL语句,不仅能get注入、post注入、还能cookie注入或利用PHP注释打碎关键词重组,解决方案如下:

伪静态:重写URL,隐藏传递的参数

关键词过滤:阻止恶意参数的输入,过滤掉敏感关键词和符号,利用正则过滤更好

SQL语言预处理:类似于一种编译过的要执行的SQL语句模板,它的优点是语句多次执行,只做一次查询,减少时间,少占用资源,效率高

现代PHP框架很多都采用MVC模式,数据库的操作都依附于Model,底层已经做好了预防SQL注入

9. CORS 跨域资源共享

我写的《HTTP API 设计入坑指南 一》里写跨域的时候提到过

10. CSRF

参考文献:

https://www.ibm.com/developer...

https://zh.wikipedia.org/wiki...

跨站域请求伪造,通过请求盗取用户cookie信息,解决策略如下:

验证HTTP Referer字段:Header里的referer字段用来记录请求的来源地址,黑客通过自己的网站去请求,地址不合法,拒绝请求。但是有些浏览器可以篡改referer值

token验证:既然黑客盗取了cookie信息,那就以参数形式加入随机的token,在服务器验证token

HTTP Header中自定义属性验证:和token一样,只是不放在参数中,而是Header头里

记得关注我呦

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/11380.html

相关文章

  • HTTP API 设计入坑指南

    摘要:而只需要服务端生成,客户端保存,每次请求在头部中使用携带,服务端认证解析就可。如果缓存不清理,验证码就会一直有效,不安全。 一、授权 参考文献:https://blog.risingstack.com/... 1. Basic authentication (最简单,适用于没有第三方的请求接口中) 客户端发送authorization,内容为 Basic Base64编码(usern...

    JayChen 评论0 收藏0
  • HTTP API 设计入坑指南(一)

    一、请求方式 1. 请求方式有get/post/put/delete/options 2. get和post的区别: get通常用作获取数据,post通常用作提交数据 get参数有长度限制,受限于URL长度(http协议对url长度不限制,而是服务器和浏览器的配置参数限制),post无限制 get幂等,post不幂等(幂等:多次请求,结果一样) header里有个参数content-length...

    jay_tian 评论0 收藏0
  • Java入坑指南

    摘要:入坑指南是滴,下面是一个最低的入坑还应该有种设计模式应该掌握的。堆栈以帧为单位保存线程的状态,对堆栈的操作为压栈和出栈执行字节码以后,将会产生程序计数器和栈,程序计数器存放将要执行下一条指令的偏移量。 Java入坑指南是滴,下面是一个最低的入坑 还应该有23种设计模式应该掌握的。╮(╯▽╰)╭注意,第一个j是大写。 Java的特点跨平台,风格接近C++最重要的api文档 https:/...

    Rindia 评论0 收藏0
  • Browserify简易入坑指南

    摘要:简要说明长处在于使用模块规范,而不是使用的模块规范,以及使用的模块规范。简单使用关于命令行工具使用,请参照官方文档。相同模块重复依赖模块重复依赖很容易理解,模块实现时可能分割为多个子文件实现,每个子文件内部可能会引用同一个模块,如。 简介 browerify: http://browserify.org/index.html browserify可以看做浏览器端的又一个模块...

    vpants 评论0 收藏0
  • FIBOS入坑指南——本地开发环境搭建

    摘要:如果出错,需要查看一下本地节点是否正在运行,在浏览器输入后记完至此,本地的开发环境基本搭建完成,如果你想试试在本地环境编写部署调用智能合约,可以参考官方开发文档,当然,后续有时间,我也会把在智能合约开发过程中踩到的坑写写。 FIBOS是什么? FIBOS 是一个结合 FIBJS 以及 EOS 的 JavaScript 的运行平台,它使得 EOS 提供可编程性,并允许使用 JavaSc...

    goji 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<