从“XML注入”保护Web服务

时间:2011-03-30 15:59:05

标签: xml web-services authentication code-injection

目前,我们的客户属于许多访问我们网络服务的不同公司。许多新客户是特许经营的一部分,并希望在同一特许经营中访问公司数据。

之前,我们将存储在其身份验证凭据中的公司ID的哈希值与他们请求数据的公司ID的哈希值进行比较,从而确保每家公司都无法为其他公司请求数据。但是,此方法将不再起作用,因为客户端可能需要访问另一个客户端数据。

问题是,防止“XML注入”的“最佳方式”是什么(如果这就是所谓的),有人可以拦截发送的Web请求并修改XML,意图查看竞争对手的数据。< / p>

到目前为止,我提出的唯一方法是维护服务器端客户端层次结构(例如,客户A / B / C是特许经营A的一部分),因此我们知道谁是哪个特许经营权的一部分,并在之前明确检查检索数据。

我注意到很多关于如何保护Web服务访问的问题,这不是我要问的。

2 个答案:

答案 0 :(得分:2)

你似乎有两个问题。

停止拦截的HTTP请求以及第三方使用的凭据

  

问题是,防止“XML注入”的“最佳方式”是什么(如果这就是所谓的),有人可以拦截发送的Web请求并修改XML,意图查看竞争对手的数据。< / p>

这将是一次中间人攻击。

解决方案很简单,通过HTTPS而不是普通HTTP传输数据来使用加密。

停止一位客户未经许可访问其他客户的数据

  

到目前为止,我提出的唯一方法是维护服务器端客户端层次结构(例如,客户A / B / C是特许经营A的一部分),因此我们知道谁是哪个特许经营权的一部分,并在之前明确检查检索数据。

这是一个不同的问题,这是解决问题的正确方法。

存储每个用户可以访问哪些数据集的列表(或其他数据结构)。在每个请求中,将请求的数据与访问用户的凭据与access control list进行比较。

答案 1 :(得分:1)

不要试图在已经拥有的“破损”凭证检查上增加额外的复杂性。改为修改凭据检查。

有什么问题?您用来检查访问权限的“凭证令牌”是公司ID(它的哈希值,但它没有任何区别)。

如何解决?只是不要使用公司ID - 改用更好的东西。

例如:当有人对您的网络服务进行身份验证时,请不要根据公司ID为其提供身份验证令牌。给他们一个auth标记(让我们在这里创建一个抽象实体)和一个“访问域”。让数据库中的每个公司以一对多的关系映射到任意数量的“访问域”。

每当有人要求提供数据时,请查看哪些访问域包含该数据(例如,检查请求数据的公司所在的域名)。如果凭证令牌授权访问这些域中的任何,请继续并提供数据。

这只是您当前凭据基础架构的基本扩展,可以满足您的需求,同时保持无会话状态(我想缺少会话状态正是系统首先设计的原因)。

当然要注意:

  • 这种访问控制系统对于受信任用户攻击是不安全的。除非有其他机制,否则阻止客户暴力破解他们发送给您的身份验证令牌直到匹配另一个公司ID(或访问域)的哈希值,他们可以访问该数据吗?
  • 正如大卫所说,它也不能抵御中间人攻击甚至是被动窃听。遵循他的建议并使用HTTPS来公开你的服务。这是一个明智的选择。