目前,我们的客户属于许多访问我们网络服务的不同公司。许多新客户是特许经营的一部分,并希望在同一特许经营中访问公司数据。
之前,我们将存储在其身份验证凭据中的公司ID的哈希值与他们请求数据的公司ID的哈希值进行比较,从而确保每家公司都无法为其他公司请求数据。但是,此方法将不再起作用,因为客户端可能需要访问另一个客户端数据。
问题是,防止“XML注入”的“最佳方式”是什么(如果这就是所谓的),有人可以拦截发送的Web请求并修改XML,意图查看竞争对手的数据。< / p>
到目前为止,我提出的唯一方法是维护服务器端客户端层次结构(例如,客户A / B / C是特许经营A的一部分),因此我们知道谁是哪个特许经营权的一部分,并在之前明确检查检索数据。
我注意到很多关于如何保护Web服务访问的问题,这不是我要问的。
答案 0 :(得分:2)
你似乎有两个问题。
停止拦截的HTTP请求以及第三方使用的凭据
问题是,防止“XML注入”的“最佳方式”是什么(如果这就是所谓的),有人可以拦截发送的Web请求并修改XML,意图查看竞争对手的数据。< / p>
这将是一次中间人攻击。
解决方案很简单,通过HTTPS而不是普通HTTP传输数据来使用加密。
停止一位客户未经许可访问其他客户的数据
到目前为止,我提出的唯一方法是维护服务器端客户端层次结构(例如,客户A / B / C是特许经营A的一部分),因此我们知道谁是哪个特许经营权的一部分,并在之前明确检查检索数据。
这是一个不同的问题,这是解决问题的正确方法。
存储每个用户可以访问哪些数据集的列表(或其他数据结构)。在每个请求中,将请求的数据与访问用户的凭据与access control list进行比较。
答案 1 :(得分:1)
不要试图在已经拥有的“破损”凭证检查上增加额外的复杂性。改为修改凭据检查。
有什么问题?您用来检查访问权限的“凭证令牌”是公司ID(它的哈希值,但它没有任何区别)。
如何解决?只是不要使用公司ID - 改用更好的东西。
例如:当有人对您的网络服务进行身份验证时,请不要根据公司ID为其提供身份验证令牌。给他们一个auth标记(让我们在这里创建一个抽象实体)和一个“访问域”。让数据库中的每个公司以一对多的关系映射到任意数量的“访问域”。
每当有人要求提供数据时,请查看哪些访问域包含该数据(例如,检查请求数据的公司所在的域名)。如果凭证令牌授权访问这些域中的任何,请继续并提供数据。
这只是您当前凭据基础架构的基本扩展,可以满足您的需求,同时保持无会话状态(我想缺少会话状态正是系统首先设计的原因)。
当然要注意: