php - 安全访问文件

时间:2011-06-19 06:17:51

标签: php iphone web-services

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

谢谢!

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

2 个答案:

答案 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&param1=value&param2=value

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

答案 1 :(得分:1)

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

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