如何防止PHP的file_get_contents()函数?

3
我的一个PHP页面返回的数据如下所示:
<?php
  //...
  echo "json string";
?>

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

有人能告诉我如何防止这种事情发生吗?

我考虑如果我可以获取请求的域名来输出其他内容。但我不知道获取请求域名的函数是什么。如果请求是由服务器发送的,那将没有帮助。我的英语很差,表达疑问请见谅。

4个回答

3

您还可以使用会话来实现。如果在应用程序的某个地方,在用户获取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

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


1
你在这里面临着一场艰苦的战斗。我假设你的服务器端处理程序响应json是通过用户浏览器中的javascript来消耗的...所以没有简单的方法来加密它。你可以尝试一些用于防止xspf的技术(参见http://en.wikipedia.org/wiki/Cross-site_request_forgery)。如果你开发了客户端来传递一些会话令牌,该令牌对每个客户端都是唯一的,那么你可以减少一些问题。但是,假设这是某种ajax类型的东西,那么窃取你的数据的人很可能会找出你放置的任何机制...如果它是一个服务器-服务器的事情,那么像sli提到的那样,基于远程ip设置一些限制会有所帮助,此外设置某种API身份验证令牌会更有帮助(请参见oauth获取一些指针)。

1
你也可以使用Apache的.htaccess来阻止每个外部请求到达页面,如果它是从内部调用的,或者阻止每个不来自你域名的请求:

Google搜索工具

编辑
你还可以使用一些包含无法读取的文件的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()函数,并在您的.htaccess文件中编写一个rewriteRule来禁止对include/文件夹的任何请求。

RewriteRule include* - [F,NC]

这将返回一个403禁止错误,对于该目录或目录中的任何文件的请求。

然后,您可以执行JSON请求,例如:file.php?file=jsonReturnFile.php&someothherParamReadByJsonFile=1

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接