如何防止PHP file_get_contents()

时间:2008-12-25 08:32:48

标签: php http

我的一个php页面返回如下数据:

<?php
  //...
  echo "json string";
?>

但其他人使用file_get_contents()来获取我的数据并在其他网站中使用。

任何人都可以告诉我,我该怎样做才能防止这种事情发生。

我考虑是否可以获取请求的域名以回应其他内容。但我不知道

获取请求的域名的函数。如果请求是由服务器发送的,那么

无益。我的英语很差,表达疑惑,请耐心等待。

4 个答案:

答案 0 :(得分:2)

您也可以使用会话。如果您的应用程序中的某个位置,在用户获取json数据之前,您启动会话,然后在此页面中输出json数据,您可以检查会话变量。这种方式只有已通过会话生成器页面的用户才能查看您的输出。 假设您有生成会话的页面A.php。在输出此页面中的任何内容之前使用此代码。

session_start();
$_SESSION['approvedForJson'] = true;

然后在您输出json数据的页面中,在输出任何内容之前,再次调用session_start()。 PHP代码的开头是调用它的好地方。 然后在输出json数据之前,检查是否存在已批准用户的会话变量。

if ( isset($_SESSION['approvedForJson']) && $_SESSION['approvedForJson'] ) {
    echo "json data";
} else {
  // bad request
}

答案 1 :(得分:1)

您可以使用$ _SERVER ['REMOTE_ADDR']来获取客户端地址的地址。你也可以检查$ _SERVER ['HTTP_REFERER']并阻止外部请求,但它不太可靠。可能还有一些涉及$_SERVER的其他技术可以尝试。

答案 2 :(得分:1)

你在这里打一场艰苦的战斗。我假设您的服务器端进程在json中的响应正在通过用户浏览器中的javascript消耗...所以没有简单的方法来加密它。您可以尝试一些用于阻止xspf的技术(参见http://en.wikipedia.org/wiki/Cross-site_request_forgery)。如果您开发的客户端传递一些每个客户端的uniq会话令牌,您可以减少一些问题。但是,无论谁窃取你的数据,都有可能找出你所采用的任何机制......假设这是某种ajax类型的东西。如果它是一个服务器 - 服务器的东西然后作为sli mentions,基于远程IP设置一些限制将有所帮助,加上设置某种API身份验证令牌将有助于更多(请参阅oauth一些指针)

答案 3 :(得分:1)

你也可以使用带有apache的.htaccess阻止对页面的每个外部请求,如果它在内部被调用或阻止不是来自你的域的每个请求:

Google search thingie

修改
您还可以使用一些包含无法读取的文件的php文件。例如,你有file.php:

<?php
 $allowedFiles[] = 'somefile.php';
 $allowedFiles[] = 'someotherFile.php';
 $allowedFiles[] = 'jsonReturnFile.php';
 if(in_array($_GET['file'], $allowedFiles)){
  include( "include/".$_GET['file'] );
 }
?>

然后你可以在该文件上允许file_ get _contents()并在你的.htacces中写一个rewriteRule来禁止对include /文件夹的任何请求。

RewriteRule include* - [F,NC]

对于该目录或目录中的任何文件的请求,将返回403 forbidden错误。

然后你可以为你做JSON请求:file.php?file = jsonReturnFile.php&amp; someothherParamReadByJsonFile = 1

当有人试图获取JSON文件的文件内容时,他们将获得禁止的错误,并且获取include.php的文件内容将不会返回任何有用的内容。