<?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 的技术可以尝试。
编辑
你还可以使用一些包含无法读取的文件的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的文件内容将不会返回任何有用的内容。