对文件的安全访问


secure access to file

我有一个iphone应用程序,它从一组php文件中获取数据。php文件根据查询字符串参数返回XML。保护和限制访问这些"网络服务"的最佳方式是什么?

谢谢!

编辑:服务器运行的是Cents/Apache,我想限制访问权限,这样只有应用程序才能访问这些文件。我不希望从应用程序外部访问这些文件。(该应用程序也将移植到android和黑莓手机上)。

您可以在iPhone应用程序中生成一个散列,该散列与其他查询应变参数一起传递。哈希应该包括一个只有web服务器和iPhone应用程序才知道的"密钥"(或"共享密钥"),以及一个或多个传递的查询字符串参数。

接收信息的PHP脚本可以重新生成散列,因为它知道"密钥"。如果"key"与查询字符串中的"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应用程序创建共享机密(本例中为"SHAREDSCRET")、"param1"answers"param2"的MD5哈希,并将其包含在对PHP文件的请求中。

iPhone请求的URL应该是这样的:

http://example.org/file.php?hash=value&expiry=timestamp&param1=value&param2=value

当然,"密钥"本身不会在查询字符串中传递,这使得人们很难弄清楚如何获取你的信息(当然,除非是通过iPhone应用程序)。

作为第一步,您可以检查用户代理是否与iphone的用户代理匹配。

在我们的例子中,我们计算静态查询参数(或路径字符串)与salt组合的哈希,并将其作为额外的查询参数发送。我们在PHP端进行同样的检查,以确保哈希是否相同。这可以用于任何客户端,但对于与PHP服务对话的每个客户端,可以有不同的salt值。