Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

API重放攻击防御 #2

Open
rico-c opened this issue Oct 17, 2018 · 0 comments
Open

API重放攻击防御 #2

rico-c opened this issue Oct 17, 2018 · 0 comments
Labels

Comments

@rico-c
Copy link
Owner

rico-c commented Oct 17, 2018

重放攻击

概念

攻击者截取到正常请求,并重复请求,当该请求涉及到类如数据库插入等操作时,大量的请求会造成问题。

目的

防止同一个请求被多次请求,保证每次请求的唯一性

流程图

https://user-gold-cdn.xitu.io/2018/4/16/162cd376398b884c?imageView2/0/w/1280/h/960/format/webp/ignore-error/1

方案

1.保证请求是在安全时间内发出(如60s)

因为一般攻击者从截取到发送请求会间隔超过60s,所以通过加入时间戳,服务器判断api的时间戳和服务器接到请求时间的时间戳差值是否大于60s,如果大于则判断为重放攻击

2.60s内的请求通过随机数nonce保证

服务端第一次在接收到这个nonce的时候做下面行为:

  1. 
去redis中查找是否有key为nonce:{nonce}的string

  2. 如果没有,则创建这个key,把这个key失效的时间和验证timestamp失效的时间一致,比如是60s。

  3. 如果有,说明这个key在60s内已经被使用了,那么这个请求就可以判断为重放请求。

nonce是由客户端根据足够随机的情况生成的,比如 md5(timestamp+rand(0, 1000)); 也可以使用UUID, 它就有一个要求,正常情况下,在短时间内(比如60s)连续生成两个相同nonce的情况几乎为0。

例子

http://a.com/?uid=123&timestamp=1480556543&nonce=43f34f33&sign=80b886d71449cb33355d017893720666

这个请求中的uid是我们真正需要传递的有意义的参数,timestamp,nonce,sign都是为了签名和防重放使用。

服务端接到这个请求:

  1. 先验证sign签名是否合理,证明请求参数没有被中途篡改
  2. 再验证timestamp是否过期,证明请求是在最近60s被发出的
  3. 最后验证nonce是否已经有了,证明这个请求不是60s内的重放请求
@rico-c rico-c added the 安全 label Oct 17, 2018
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

1 participant