如何保证,接口请求的安全?(困扰已久,求大神!)

之前学习了app的开发,接口的制作上是没有问题的,但是现在有一个问题,就是接口的安全!
首先,我想到的是使用token和密钥,通过一些APP和服务器约定同一加密方法,然后对比密钥是否一样,一样,则通过,不一样,则拒绝。
这样可以保证别人在抓包的时候,不可以改参数进行请求,因为参数变了,密钥也就变了,也就通过不了,这一点,和问题里面有一篇文章,想法和我大致相同:http://qa.phalapi.net/?/article/8
但是,如何保证接口请求的一次性?
即,我抓到包之后,原封不动的,进行请求,因为啥也没改,所以在验证密钥的时候,是肯定能通过的。
上面的这个文章中写到,将上一次的请求唯一标示作为key随机数和时间戳作为value保存起来,意思是不是在接到请求的时候,对比一下如果请求的随机数和缓存里面的随机数一样,并且请求带的时间和缓存里面的时间一样,就说明是同一请求,就可以拒掉!
但是,这样只能对比和上一次的是否一样,如果我抓到了请求,等一会,等新请求将缓存里面更改之后,我再去用这个请求来访问,因为啥也没改,所以密钥没问题,而且缓存里面的时间和随机数也不一样,这样就通过了???但这肯定不合理,如何解决?
如果说在缓存里面多存几条,这也不合适,因为不知道要缓存多少条;
-----------------------------------------
这个问题困扰好久了,一直没有找到方法,望大神能给解答!
已邀请:

dogstar - PhalApi创始人

赞同来自:

不好意思,对于接口防刷这块,我这边暂时没有好的建议。@wenzhenxi 帮忙看下?

一个网名

赞同来自:

@wenzhenxi 求指教!

tototo163

赞同来自:

可以使用API Gateway类似的产品,开源例如Kong。阿里云上也有一个API Gateway不过貌似不太合适。
 
这个主要用于解决权限和防刷的需求。
 
实在要是不想做这些,可以自己写代码放在init.php; DI()->request->getHeader中判断下。

x2x4com

赞同来自:

防刷的确是个问题
 
我们之前在传参上面加上客户端时间戳,在进来后与服务器端进行比对,在签名验签的时候加上时间戳秘钥,至少保证在一段时间后会过期。

x2x4com

赞同来自:

if ($timestamp < ($sys_time + 600) and $timestamp > ($sys_time - 600)) {
    //时间戳超时,10分钟以上,强制签名错误
    $fixed_time = $timestamp;
}

function sign($method,$salt_key,$timestamp) {
    return sha1(md5($method) . md5($salt_key) . md5($timestamp));
}
 
 
愿意可以改成60秒一次,如果泄露了salt_key也就无效了

要回复问题请先登录注册