2012-01-31 66 views
1

这是一个奇怪的问题。我开发了一个简单的iPhone应用程序来管理我公司的实时销售统计数据。第一个障碍是弄清楚如何让应用程序与我们的旧MSSQL 2005服务器进行通信。经过一番研究,似乎最快的方法是创建一个基本的ASP页面,通过response.write()调用来查询结果。实际上这个工作非常好 - 但返回结果的ASP页面对整个世界都是开放的。我唯一的'安全'机制根本就不是一个 - 改变服务器端的HTTP端口。ASP页面和Cocoa/ObjC之间的安全通信

所以我的问题是 - 这是什么最佳实践? ASP和Objective-C之间会起什么作用?我已经阅读了一些基本的挑战 - 响应,加密等等,但是对于一个简单的通常无法理解的销售数字来说,这看起来有些过火。然而,随着应用程序发展到更复杂的东西,我希望在asp开始发回更多敏感数据之前解决这个问题。

这是我与服务器代码的连接,如果有帮助的话。常数就在那里,所以我可以将POST数据附加到它以根据我想要从应用程序得到不同的统计数据。这个逻辑在其他地方并不重要。

NSString * const appDataUrl = @"http://{the url for the asp page}"; 

//Don't ask me how this works. Google FTW... 
-(NSString *) pullData:(NSString *) url { 
    NSError * error = nil; 
    NSURLResponse * response = nil; 
    NSData * downloadedData = 
     [NSURLConnection sendSynchronousRequest: 
     [NSURLRequest requestWithURL: 
      [NSURL URLWithString:url]] returningResponse:&response error:&error]; 
    NSString *strData = [[NSString alloc]initWithData:downloadedData encoding:NSUTF8StringEncoding]; 
    return strData; 
} 

谢谢你们。

+0

欢迎来到StackOverflow!随时阅读[常见问题](http://stackoverflow.com/FAQ)并保持一段时间。另外,不要犹豫,选择一个用户名和gravatar。 – Moshe 2012-01-31 16:15:11

回答

3

您可以使用HTTP身份验证(例如摘要),在其中为每个请求添加用户名和密码。我不知道Objective-C是否有必要的库来生成相关的摘要标记,但是如果没有,您可以使用其中一个我可以处理的HTTP库。

然后,您可以在IIS内添加所需的身份验证,以便只有知道用户名和密码的人才能访问该URL。

这样做的另一种方法是在Objective-C中为HTTP请求添加一个特殊的头文件,例如带有特殊随机值(可以是预定义的GUID)的X-Auth。

该请求将与该特殊标题一起发送,您可以在ASP中检查其存在和其值。

我还建议添加SSL,以便您可以通过HTTPS访问此请求,以便任何人都无法嗅出数据。

+0

非常好,这听起来像是现在最好的解决方案。所以基本上我可以像设置常量到@“http://myurl.com?auth=blahblahblahsomethingcrazy并在我的asp代码中检查它,然后使用SSL来隐藏该信息流,我需要更多地研究SSL,但这是一个好的第一步 – alukaiser 2012-01-31 16:44:24

+0

确保没有任何东西被保存的最好方法是使用“auth”参数从你的objective-c代码执行一个HTTP POST,或者传递这个参数是一个HTTP HEADER(而不是URL查询参数)。 – 2012-02-01 13:50:33

1

用SSL包装通信。

根据您的使用情况,您只需要您的应用程序(在iPhone上运行)即可访问您的Web服务。为此,请在您的应用程序与运行ASP服务的Web服务器上的端点之间配置相互认证的SSL。如果您的应用只与您的服务器通信,则不需要CA颁发的SSL证书,但可以使用自签名证书。作为资源,在您的服务器上部署自签名身份证书并在您的应用内部署自签名客户身份证书。配置您的服务器以要求客户端证书,并且只允许您发布和您的应用正在使用的证书;这将导致您的服务器只接受来自客户端应用程序的请求。将您的客户端配置为仅信任服务器上部署的服务器证书(因此它只能与您的服务器通信以获取此数据)并在连接时呈现客户端证书(以便它可以向服务器进行自我验证)。然后,只有您的应用程序可以调用您的服务器,客户端只能从您的有效来源获取数据,并且整个事务都被加密和验证。

+0

+1不会嵌入用户名/密码或让用户在iDevice上输入它们。 – 2012-01-31 16:32:28