SaaS系统的接口对资源访问范围进行限制

来源:互联网 发布:淘宝托管公司收费 编辑:程序博客网 时间:2024/05/20 13:40

SaaS系统中,不同用户的资源应该是互相不可见的,但我们系统中,已登录的用户A,如果篡改掉接口调用的参数,是可以访问到其它用户的资源的。其实早就意识到这个问题了,前段时间才抽空把这个洞给补上,现在把方法记下来,供更多的同学们参考。


1. 问题

系统前后台分离,通过http接口调用。用户有很多不同类型的资源,用户查看资源一般是先看列表,再点详情。点详情时,通过http://abc.com/resource/info.do/xxx来获得(xxx是资源的id)。问题来了,已登录的用户A,看到浏览器的http访问,把xxx参数一改,很容易就看到其它用户的资源了。


2. 分析

问题很简单,估计大家会想,在接口中检查一下资源的归属不就行了。但当资源有N多种,还有层级关系的时候,事情就没这么简单了。

比如在线投票系统,先有投票,有选项,投票有结果。在查看投票结果的接口里,检查投票结果的归属要查好几层表才能确定。如果投票结果还能在一定范围内共享可见时,查明归属权限是件很麻烦的事。


3. 解决办法

a. 在资源中增加签名,签名用md5(资源id+日期+"abcdef")来生成。最简单的是在资源的bean class里加上getSign()方法

b. 资源列表中获得每个资源的sign,在详情接口中把签名做为sign参数带上

c. 在接口前面加一个filter,校验sign


4. 反思

其实还有一些简单的办法,比如资源id用uuid,或者资源id中本身就带有所有者的标记。不过这些只有在系统开始设计的时候就想好,后面再改就难了。

这个漏洞导致用户资源裸奔了这么久,感到深深的羞愧啊!~


过程中研究了微信服务号的做法,但没整明白。只知道每个接口需要带一个签名参数,每个接口的签名参数都是一样的,通过修改资源id,微信可以知道资源不属于我。不知道微信在后台是怎么做的。如果有懂的同学麻烦给解惑一下哈。



PS,好久不写博客了,这个编辑器真难用

原创粉丝点击