2012-09-01 79 views
3

我在我的iOS应用程序像这样的代码:如何防止未经授权的HTTP请求?

URL *url = [NSURL URLWithString:@"http://urltomyapp.com/createaccount"]; 
ASIFormDataRequest *createAccountRequest = [ASIFormDataRequest requestWithURL:url]; 
[createAccountRequest setPostValue:email forKey:@"email"]; 
[createAccountRequest setPostValue:password forKey:@"password"]; 
[createAccountRequest startAsynchronous]; 

在我的服务器上执行,我简单地采取通过self.request.get(“电子邮件”)此信息,并创建一个帐户,没有做任何检查或任何东西。然而,似乎任何人都可以轻松地运行上面的代码(我的意思是你需要做的就是复制上面的代码并把它放到你自己的应用程序中,对吗?),所有他们需要知道的是服务器地址,他们可以将他们想要的任何数据附加到请求中,服务器将继续为它们创建一个帐户。

我该如何授权请求才能知道他们来自我的应用程序和我的应用程序?这是一个普遍的问题吗?其他产品如何防止这种情况发生?

回答

2

首先,免责声明。我当然不是不是的网络专家,也不是我的安全专家。事实上,我根本就没有回答的唯一原因是Stackmonster的答复中的讨论。

但是,我知道拦截SSL连接非常容易,尤其是在用户是同谋的情况下。

一般来说,我认为以下是一些好处。

您必须确定您尝试保护的是谁/什么。如果你只是想保护应用程序和服务器之间的通信数据,https将会很好。外部监听与窥探其他SSL流量一样有效(或无效)。但是,如果你试图保护你的API(你的问题似乎暗示了这一点),那么用户看到你发送的命令是很简单的(就像你自己用Charles发现的那样),这是微不足道的。

那么,你想阻止任何人知道你的API的细节吗?你想只是防止DOS攻击,或者只让有效用户发出命令,或者什么?

然后,您可以担心身份验证和授权(两个不同的主题)。也许验证请求来自已知实体就足够了。

无论如何,指导是非常困难的,因为您首先必须决定您的网络隐私目标是什么。

然后,如果他们是崇高的,你在阅读很多。

但是,在某些时候,您必须决定什么对您的应用/业务至关重要,哪些不是。就像任何优秀的软件设计一样,然后创建一组要求。然后,按照某种顺序排列优先次序(例如,强制性的,基本的,好的,可以没有的)。

这会告诉你,如果你需要额外的安全性和什么样的。

然而,大多数人发现,即使锁上所有的门和挡住窗户,也不值得浪费时间和金钱(更不用说保护烟囱,在墙壁,地板和天花板上添加混凝土,房间,并雇用武装警卫)。

+0

我不想过度安全或偏执。我认为我不理解的是(作为一个例子):我在我的服务器“createaccount”中有一个url,它需要发送两个参数与请求:电子邮件和密码。这个脚本不需要任何身份验证(我的意思是我可以在这里进行身份验证),所以似乎任何一个(无论如何都没有理由)可以通过10,000次迭代发送一个for循环,向这个url发送请求并创建10,000用户帐户。也许这不会经常发生,但是什么阻止了它的发生?我不应该为此担心吗? – Snowman

+0

你应该担心吗?只有它很重要。在这种情况下,您将不得不采用某种类型的服务器端措施来检测/防止您不需要的行为。如果您的服务器端口向互联网开放,任何人都可以向您发送他们想要的任何内容。如果标准服务器不够用,则必须采用服务器端措施。最后,如果有人决心滥用你的服务器,那么防御时间和金钱都会花费你很多。我想大多数人都选择把门锁上,然后等待看看他们是否需要做更多的事情。 –

2

使用HTTPS并在应用程序中放置证书以验证客户端是否允许与服务器通信。

但是相信我,它真的不值得这一切。使用HTTPS通常可以自行使用。

+0

我正在使用HTTPS,但是这是如何改变的? – Snowman

+0

如果您使用HTTPS,则无法嗅探客户端到服务器的流量。但是,您的服务器确实存在,因此可以在网络上调用它。如果您向客户部署证书,则只有拥有证书的客户才能与您通话。 只有这样才能防止它。但是它并不那么重要,如果您使用HTTPS违规客户端通常不知道如何与您的服务器通信,那么它们将会出错。 –

+0

我以为使用HTTPS只是启用您的服务器中的复选框,并更改网址使用https://而不是http:// ..?有人仍然不能向https:// url发送请求吗?我会有什么,他们不会有? – Snowman