有人说世上百分之九十的事都能用钱解决,但他们没告诉你剩下的百分之一需要更多的钱。
Api接口存在那些安全性问题呢?
1、重复提交 - 也就是幂等性设计问题
2、参数篡改
解决方式:签名以及加密
防御方式:1)使用https协议传输 2)对参数以某种方式进行加密
3、防重发攻击 (就是把之前窃听到的数据原封不动的被重放或多次重放)
防御方式:需要通过在请求体中携带当前请求的唯一标识,并且进行签名防止被篡改
a) 基于timestamp和nonce
微信支付的接口就是这样设计的
timestamp的作用
每次HTTP请求,都需要加上timestamp参数,然后把timestamp和其他参数一起进行数字签名。
HTTP请求从发出到达服务器一般都不会超过60s,所以服务器收到HTTP请求之后,首先判断时间戳参数与当前时间相比较,是否超过了60s,如果超过了则认为是非法的请求。
一般情况下,从抓包重放请求耗时远远超过了60s,所以此时请求中的timestamp参数已经失效了,如果修改timestamp参数为当前的时间戳,则signature参数对应的数字签名就会失效,因为不知道签名秘钥,没有办法生成新的数字签名。
但这种方式的漏洞也是显而易见的,如果在60s之后进行重放攻击,那就没办法了,所以这种方式不能保证请求仅一次有效
nonce的作用
nonce的意思是仅一次有效的随机字符串,要求每次请求时,该参数要保证不同。我们将每次请求的nonce参数存储到一个“集合”中,每次处理HTTP请求时,首先判断该请求的nonce参数是否在该“集合”中,如果存在则认为是非法请求。
nonce参数在首次请求时,已经被存储到了服务器上的“集合”中,再次发送请求会被识别并拒绝。
nonce参数作为数字签名的一部分,是无法篡改的,因为不知道签名秘钥,没有办法生成新的数字签名。
这种方式也有很大的问题,那就是存储nonce参数的“集合”会越来越大。
nonce的一次性可以解决timestamp参数60s(防止重放攻击)的问题,timestamp可以解决nonce参数“集合”越来越大的问题。
4、数据信息泄露(场景:截获用户登录请求,截获到账号、密码等)
预防方式:参数进行加密传输
如果为了保证更加的安全,可以加上RSA,RSA2,AES等等加密方式,保证了数据的更加的安全,但是唯一的缺点是加密与解密比较耗费CPU的资源。
5、SQL注入
预防方式:1)普通用户与系统管理员用户的权限要有严格的区分;2)使用正则表达式过滤传入的参数;3)使用预编译语句来代替原生语句;4)
6、跨域攻击 XSS JS脚本注入 获取用户信息(token等等)
预防方式:使用特殊字符转换的方式 +过滤器拦截处理
7、CSRF(Cross Site Request Forgery, 跨域请求伪造)
预防方式:1)后端判断referer是否合法(不推荐) 通过HTTP的referer可知道,用户是通过哪个网站发送这个请求的;2)实现限流(1分钟之内接受1000个请求),配置黑名单白名单(如果发现某人恶意请求攻击,屏蔽他的IP);3)每次请求带上token
8、Http请求防盗链
防御方式: 判断http请求头Referer域中的记录来源的值,如果和当前访问的域名不一致的情况下,说明该图片可能被其他服务器盗用。 Referer字段中记录了访问的来源(浏览器访问链接地址),相当于限制资源(图片、文字) 只能在某个域名(限制某个服务器)来源进行访问。
9、文件上传漏洞
预防方式:1)在上传文件时候 一定要使用判断文件流的方式 确定是图片 不要判断后缀方式获取图片
2)静态资源与动态资源分开服务器 Nginx+Tomcat实现 动静分离 Nginx存放静态资源 没有tomcat环境
3)服务器硬盘上不能做删除操作
4)权限设置 对于目录的操作权限没有
5)前端做后缀限制
6)服务器上不要有热部署功能。如果我上传class文件。 Java程序就能获取到了。限制 jsp exe 等可执行程序。
10、Dos攻击
防御方式: 解决这个问题就要用到高防服务器,如果租用高防服务器的话,它的防御能力、访问速度、稳定与否都是首要考虑因素