【发布时间】:2008-12-25 08:32:48
【问题描述】:
我的一个 php 页面返回如下数据:
<?php
//...
echo "json string";
?>
但是其他人使用 file_get_contents() 来获取我的数据并在其他网站上使用。
谁能告诉我我能做些什么来防止这种事情发生。
我考虑是否可以获取请求的域名来回显其他内容。但我不知道
获取请求域名的功能。如果请求是由服务器发送的,那么
将无济于事。我的英文很差,有疑问请多包涵。
【问题讨论】:
我的一个 php 页面返回如下数据:
<?php
//...
echo "json string";
?>
但是其他人使用 file_get_contents() 来获取我的数据并在其他网站上使用。
谁能告诉我我能做些什么来防止这种事情发生。
我考虑是否可以获取请求的域名来回显其他内容。但我不知道
获取请求域名的功能。如果请求是由服务器发送的,那么
将无济于事。我的英文很差,有疑问请多包涵。
【问题讨论】:
您也可以使用会话。如果在您的应用程序的某个地方,在用户获取 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
}
【讨论】:
您可以使用 $_SERVER['REMOTE_ADDR'] 来获取客户端地址的地址。您还可以检查 $_SERVER['HTTP_REFERER'] 并以这种方式阻止外部请求,但它不太可靠。您可能还可以尝试一些涉及$_SERVER 的其他技术。
【讨论】:
你在这里打一场艰苦的战斗。我假设您在 json 中响应的服务器端进程正在通过您的用户浏览器中的 javascript 使用......所以没有简单的方法来加密它。您可以尝试一些用于防止 xspf 的技术(请参阅 http://en.wikipedia.org/wiki/Cross-site_request_forgery )。如果您开发客户端以传递一些每个客户端唯一的会话令牌,则可以减少一些问题。但是,窃取您的数据的人很可能会弄清楚您采用的任何机制......假设这是某种 ajax 类型的东西。如果它是服务器-服务器的事情,那么正如 sli 所提到的,基于远程 ip 设置一些限制会有所帮助,另外设置某种 API 身份验证令牌会更有帮助(请参阅 oauth 以获得一些指示)
【讨论】:
您还可以将 .htaccess 与 apache 结合使用,以阻止对页面的每个外部请求(如果它在内部被调用)或阻止不是来自您的域的每个请求:
编辑
您还可以使用一些 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 禁止错误。
然后您可以向类似以下内容的 JSON 请求:file.php?file=jsonReturnFile.php&someothherParamReadByJsonFile=1
当有人试图获取 JSON 文件的文件内容时,他们会收到禁止错误,并且获取 include.php 的文件内容不会返回任何有用的内容。
【讨论】: