restful 网络参数篡改

restful Web Parameter Tampering

我想了解如何使用 restful 客户端为经过身份验证的用户实现安全性。我遇到问题的场景是如何阻止用户更新不属于他自己的购买,因为 restful 客户端传回了购买 ID。对于熟练的用户来说,产品 ID 很容易被篡改。我真的不想被夹在中间,因为使用 https 可以防止或减轻它。我对尝试更新不属于他们的内容的用户非常感兴趣。

您如何在其他世界防止此类攻击? Web Parameter Tampering

您遇到的问题叫做authorization. Once the user is authenticated,授权是授予他访问特定资源的权限。 REST场景下的授权应该在服务端实现。

假设用户 Bob 试图通过向 /purchases/1 端点(提供适当的有效载荷)。服务器有责任验证 Bob 是否被允许修改实体(例如,通过检查是否真的是 Bob 进行了购买)。如果授予权限,服务器将继续操作并返回 2xx success HTTP status code. Otherwise 403 错误代码,通知用户无权修改给定的购买。

一旦建立了授权机制,另一个问题就出现了:用户张贴恶意输入以试图欺骗和克服授权机制。这涉及到一个非常广泛的 Web 应用程序安全主题。有很多针对 webapps 的已知攻击(例如 injection attacks) and even more ways of protecting against them. Testing applications for security vulnerabilities is called penetration testing。值得一提的是,有执行此类测试的自动化工具(以及执行此类攻击的自动化工具)。

总的来说,您触及了一个非常广泛的话题,SO 答案无法解释其中的百万分之一。将此答案作为您自己在该地区进行调查的起点。

参考

[编辑] REST 无状态

当没有 应用程序状态 存储在服务器上时,

API 是无状态的(与 资源状态 相反)。 Click here for a nice explanation of the difference between these two. There's a lot of discussions out there about statelessness (particularly in context of authentication) - look up SO or Google.

简而言之,鉴于当今的大型分布式系统,REST 中的无状态身份验证非常重要。在集群环境中跨多个节点共享时,此类环境中的服务器端应用程序状态可能会导致可伸缩性问题。这就是为什么建议使应用程序状态完全在客户端。我知道一开始您可能会感到困惑,尤其是在您在我的回答中读到服务器应该授权用户操作之后。 Here 是无状态身份验证实现的示例(数字签名的自包含会话令牌)。

但不要害怕 - 实际上大多数系统都至少在服务器上存储部分应用程序状态(AFAIK Google 在他们的系统中这样做)。所以就像 this answer 中所述:

"REST is not a religion (...), you should only follow the tenets of REST as far as they make sense for your application"