授权REST请求

15

我正在开发一个REST服务,它有几个要求:

  1. 必须是安全的。
  2. 用户不应该能够伪造请求。

我目前提出的解决方案是使用一个自定义的授权头部,形式如下(这与亚马逊Web服务的方式相同):

Authorization: MYAPI username:signature

我的问题是如何生成签名。当用户登录服务时,他们会获得一个密钥,可以用于对请求进行签名。这将阻止其他用户代表他们提交请求,但不能阻止他们伪造请求。

将使用此服务的应用程序是一款iPhone应用程序,因此我在考虑我们可以在应用程序中嵌入一个公钥,以便我们可以进行额外的签名,但这是否意味着我们需要有两个签名,一个是用户密钥,另一个是应用程序密钥?

任何建议都将不胜感激,我希望第一次就做到正确。


定义“伪造请求”。是什么实体创建了非伪造请求?是客户端软件吗? - Alexander
4个回答

8
答案很简单:这是无法做到的。一旦您向最终用户发送任何解决方案,他或她就可以攻击与之通信的服务器。这个问题的最常见版本是Flash游戏中的欺诈行为。您可以通过在客户端嵌入某种加密并混淆代码来使其更难...但所有已编译和混淆的代码都可以被反编译和取消混淆。这只是花费时间和金钱以及潜在攻击者的限制问题。
因此,您关心的不是如何尝试防止用户向您的系统发送错误数据,而是如何防止用户损坏您的系统。您必须设计接口,以便由错误数据造成的所有损坏仅影响发送它的用户。

在这种情况下,我们将部署到iPhone上,因此存在某人反编译代码的风险。您在帖子中提出了非常有效的观点,即限制损坏仅限于该用户的数据,而在这种情况下,他们将能够在游戏中作弊,因此我们需要能够识别作弊者并有效地处理他们。这不是一项容易的任务。 - jonnii
保护游戏的唯一方法是在服务器上完全运行,并仅通过网络发送用户操作。我通常会做以下事情:1.增加作弊难度 2.尽可能保存更多信息。作弊通常很容易被发现,因此您可以之后删除该用户的所有条目。 - Johan Öbrink
如果您正在开发一款游戏,并且遇到了作弊问题,那么您就有一整套工具可供使用——这取决于它是技能游戏还是机会游戏。一般来说,玩家表现可以通过统计学方法进行测量,奇怪的模式也可以被发现——这就是许多娱乐行业欺诈检测系统的工作原理。另一个立即想到的事情是算法设计,它为游戏引入了某些可测量的属性,例如浮点数中的误差累积。 - mst

2

首先我要使用SSL进行请求(这是好的),但它不能阻止用户从非iPhone设备登录API并提交伪造请求。 - jonnii
他们如何通过摘要认证伪造请求?他们如何获取当前nonce值并创建可接受的摘要响应? - S.Lott
他们可以伪造请求,因为他们可以创建一个第三方客户端应用程序登录到API,此时他们可以提交自己的请求。我需要验证API请求的来源。 - jonnii
为什么不能在响应中使用客户端 nonce,该 nonce 是每个 iPhone 独有的签名字符串? - S.Lott
当用户登录时,我们会获取他们的设备ID,这可能有效。我会调查一下并看看我能得出什么结论。 - jonnii
如果你可以读取设备 ID,攻击者也可以。它并不能提供完全的保护。但它确实可以使攻击变得困难,这可能已经足够了。将其与广泛的日志记录相结合,你应该能够识别作弊并删除该用户的所有记录(并阻止其访问?)。 - Johan Öbrink

1

我认为做这件事情最简单的方法是使用HTTPS客户端身份验证。苹果的网站上有一个主题专门讨论这个问题。

编辑:为了处理授权,我会在服务器上为每个用户创建一个单独的资源(URI),并且只允许该(经过身份验证的)用户操作此资源。

编辑(2014年):苹果在过去的六年中更改了他们的论坛软件;该主题现在位于https://discussions.apple.com/thread/1643618


这如何防止用户伪造请求? - jonnii
@StevenHuwig 是的。目的是为了吸引发帖者(您)回来,这样您就可以修正您的答案,然后当您评论说“谢谢,我已经修复了”时,我会移除-1。这是一种质量控制的做法,没有更多的意思 :) - Peter Morris
1
似乎更有建设性的做法是花30秒钟去追踪原始链接并在评论或编辑中发布它。 - Steven Huwig
Steven,如果你想通过邮件(mrpmorris@gmail.com)与我讨论这个问题,或者在Skype上联系我(mrpmorris),我乐意与你沟通。我的行为并非恶意。 - Peter Morris
1
@PeterMorris 没有什么可讨论的;你忽略了明确说明的downvotes目的,当然我无法阻止它。你的意图是无关紧要的。http://stackoverflow.com/help/privileges/vote-down - “每当您遇到一个极其懒惰、没有付出努力的帖子或者一个明显且可能危险的错误答案时,请使用downvotes。” - Steven Huwig
显示剩余6条评论

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接