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 答案无法解释其中的百万分之一。将此答案作为您自己在该地区进行调查的起点。
参考
- Nice post on SO about REST authentication
- The Open Web Application Security Project 专注于提高软件安全性的全球性非营利慈善组织
- OWASP's Guide To Authorization
- OWASP's REST Security Cheat-Sheet
- List of HTTP status codes
[编辑] 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"
我想了解如何使用 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 答案无法解释其中的百万分之一。将此答案作为您自己在该地区进行调查的起点。
参考
- Nice post on SO about REST authentication
- The Open Web Application Security Project 专注于提高软件安全性的全球性非营利慈善组织
- OWASP's Guide To Authorization
- OWASP's REST Security Cheat-Sheet
- List of HTTP status codes
[编辑] 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"