我有一个从一组php文件中获取数据的iphone应用程序。 php文件根据查询字符串参数返回XML。 什么是保护和限制访问这些“Web服务”的最佳方法?
谢谢!
编辑:服务器正在运行CentOS / Apache,我想限制访问权限,以便只有应用程序才能访问这些文件。我不希望从应用程序外部访问这些文件。 (该应用程序也将移植到Android和黑莓手机上。)
答案 0 :(得分:2)
您可以在iPhone应用程序中生成一个与其他查询应变参数一起传递的哈希值。哈希应该包括一个“密钥”(或“共享密钥”),它只能由Web服务器和iPhone应用程序知道,以及一个或多个传递的查询字符串参数。
接收信息的PHP脚本然后可以重新生成哈希,因为它知道“密钥”。如果“key”与查询字符串中的那个匹配,则该请求有效并来自iPhone,否则它不会。
更新:为了防止有人使用相同的查询字符串反复请求相同的信息,您可以向查询字符串和哈希添加“到期”时间戳并检查该请求如果哈希值有效,则表示尚未过期。
我无法提供Objective-C,但您的PHP脚本可能如下所示:
<?php
$hash = md5('SHAREDSECRET'.$_REQUEST['expiry'].$_REQUEST['param1'].$_REQUEST['param2']);
if ( $hash != $_REQUEST['$hash'] || time() > $_REQUEST['expiry'] )
die('Invalid request.');
// Some additional code here for valid requests.
?>
基于上面的示例,您希望iPhone应用程序创建共享密钥的MD5哈希值(在本例中为“SHAREDSECRET”),“param1”和“param2”并将其包含在请求中PHP文件。
iPhone请求的网址应如下所示:
http://example.org/file.php?hash=value&expiry=timestamp¶m1=value¶m2=value
当然,“密钥”本身不会在查询字符串中传递,这使得某人很难弄清楚如何获取您的信息(当然,除非通过iPhone应用程序)。
答案 1 :(得分:1)
作为第一步,您可以检查用户代理是否与iPhone的匹配。
在我们的例子中,我们计算一个静态查询参数(或路径字符串)与salt结合的散列,并将其作为额外的查询参数发送。我们在PHP端进行相同的检查以确保散列是否相同。这可以用于任何客户端,但是对于与PHP服务对话的每个客户端,您可以使用不同的salt值。