一、授权
参考文献: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安全中心就是这个原理,更多内容参考
7. Oauth2
Oauth2相当于第三方,在客户端和服务端之间多设置了一层,用户给客户端授权,客户端向第三方认证申请token,申请成功后使用token向服务端申请资源
参考文献:
二、安全
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
参考文献:
跨站域请求伪造,通过请求盗取用户cookie信息,解决策略如下:
- 验证HTTP Referer字段:Header里的referer字段用来记录请求的来源地址,黑客通过自己的网站去请求,地址不合法,拒绝请求。但是有些浏览器可以篡改referer值
- token验证:既然黑客盗取了cookie信息,那就以参数形式加入随机的token,在服务器验证token
- HTTP Header中自定义属性验证:和token一样,只是不放在参数中,而是Header头里
记得关注我呦
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。