前后端分离,如何防止接口被其他人调用或恶意重发?
首先,http协议的无状态特性决定了是无法彻底避免第三方调用你的后台服务。我们可以通过crsf、接口调用频率、用户行为分析(来源等)等各个方面来增加第三方调用的难度,也可以通过添加一个中间层比如node.js来实现;
1. 非法访问通常使用认证来解决,方法很多session,token,oauth第三方框架等等。
(1)常规的方法:用户登陆后生成token,返回客户端,然后服务器使用AOP拦截controller方法,校验token的有效性,每次token是一样的;
(2)用户登陆后生成临时token,存到服务器,并返回客户端,客户端下次请求时把此token传到服务器,验证token是否有效,有效就登陆成功,并生成新的token返回给客户端,让客户端在下一次请求的时候再传回进行判断,如此重复。 这种方法有性能问题,但也有一个漏洞,如果用户在一次请求后,还未进行下一次请求就已被黑客拦截到登录信息并进行假冒登录,他一样可以登录成功并使用户强制下线,但这种方法已大大减少被假冒登录的机会。
(3)两层token:一般第一次用账号密码登录服务器会返回两个token,时效长短不一样,短的时效过了之后,发送时效长的token重新获取一个短时效,如果都过期,那么就需要重新登录了。当然更复杂你还可以做三层token,按照业务分不同token。
2. 对于合法的认证访问,通常需要进行IP访问频率和次数的限制,各种API框架都有支持,比如Django restframework的throttling。
通常我们可以通过使用过滤器和缓存如redis来判断访问次数及频率。在filter层加一个过滤器,拦截所有的请求,解析出请求的用户,然后通过缓存,获取到该用户当前已访问次数。而缓存,要求最好能够自动超时回收,也就是说比如你想设定三分钟内限制访问次数,那么你记录的缓存有效期就三分钟就好了,过了三分钟缓存自动失效,计数器也就重新从0开始了。类似于发短信的接口,每分钟只能发一次;
3. 最外层的限制可能需要在nginx上配置rate limit。
参考自:http://blog.csdn.net/codercwm/article/details/58607420
http://blog.csdn.net/mylovepan/article/details/38894941
-
1. 加密,时间戳,每个包要有包序号,每次同向加1,收到重复序号认为是攻击,可以抵御重放攻击。此外借助于HTTPS/TLS其自身机制,保证了消息完整性,并且可以抵御重放攻击。由于加密,对方也无法看到明文内容。
-
2. 客户端生成一串随机数R1,发给服务器,服务器判断此R1是否重复,之后根据算法(R1+R2)生成密钥。最好是结合验签机制。
-
3. https 会被中间人攻击,Fiddler 能用替换证书的方式截获并还原明文。非对称加密(例如RSA)是个好办法,不过你得防止别人直接反编译你的代码分析出你的明文拼接方式。