之前学习了app的开发,接口的制作上是没有问题的,但是现在有一个问题,就是接口的安全!
首先,我想到的是使用token和密钥,通过一些APP和服务器约定同一加密方法,然后对比密钥是否一样,一样,则通过,不一样,则拒绝。
这样可以保证别人在抓包的时候,不可以改参数进行请求,因为参数变了,密钥也就变了,也就通过不了,这一点,和问题里面有一篇文章,想法和我大致相同:
http://qa.phalapi.net/?/article/8
但是,如何保证接口请求的一次性?
即,我抓到包之后,原封不动的,进行请求,因为啥也没改,所以在验证密钥的时候,是肯定能通过的。
上面的这个文章中写到,将上一次的请求唯一标示作为key随机数和时间戳作为value保存起来,意思是不是在接到请求的时候,对比一下如果请求的随机数和缓存里面的随机数一样,并且请求带的时间和缓存里面的时间一样,就说明是同一请求,就可以拒掉!
但是,这样只能对比和上一次的是否一样,如果我抓到了请求,等一会,等新请求将缓存里面更改之后,我再去用这个请求来访问,因为啥也没改,所以密钥没问题,而且缓存里面的时间和随机数也不一样,这样就通过了???但这肯定不合理,如何解决?
如果说在缓存里面多存几条,这也不合适,因为不知道要缓存多少条;
-----------------------------------------
这个问题困扰好久了,一直没有找到方法,望大神能给解答!
5 个回复
dogstar - PhalApi创始人
赞同来自:
一个网名
赞同来自:
tototo163
赞同来自:
这个主要用于解决权限和防刷的需求。
实在要是不想做这些,可以自己写代码放在init.php; DI()->request->getHeader中判断下。
x2x4com
赞同来自:
我们之前在传参上面加上客户端时间戳,在进来后与服务器端进行比对,在签名验签的时候加上时间戳秘钥,至少保证在一段时间后会过期。
x2x4com
赞同来自:
//时间戳超时,10分钟以上,强制签名错误
$fixed_time = $timestamp;
}
function sign($method,$salt_key,$timestamp) {
return sha1(md5($method) . md5($salt_key) . md5($timestamp));
}
愿意可以改成60秒一次,如果泄露了salt_key也就无效了