我正在处理实时天气数据页面。我们的天气模块以 CSV 格式输出数据并将其存储在我的网络服务器上。然后,我使用 PHP 脚本将 CSV 转换为数组,然后将其编码为 JSON 并将其输出,以便我的 jQuery Ajax 脚本可以经常调用它以获取最新数据并更新页面。到目前为止,这工作得很好。
我的问题是,如何防止用于检索 JSON(上述 PHP 脚本的 URL)的 URL 在浏览器中打开和查看?我尝试调整权限,但没有成功。
提前感谢任何愿意提供帮助的人。
我正在处理实时天气数据页面。我们的天气模块以 CSV 格式输出数据并将其存储在我的网络服务器上。然后,我使用 PHP 脚本将 CSV 转换为数组,然后将其编码为 JSON 并将其输出,以便我的 jQuery Ajax 脚本可以经常调用它以获取最新数据并更新页面。到目前为止,这工作得很好。
我的问题是,如何防止用于检索 JSON(上述 PHP 脚本的 URL)的 URL 在浏览器中打开和查看?我尝试调整权限,但没有成功。
提前感谢任何愿意提供帮助的人。
没有真正的方法可以做到这一点,因为 Ajax 调用也来自浏览器。正确的浏览器调用和 Ajax 调用之间没有真正的区别。GET 调用是 GET 调用。
编辑
根据@Adeneo 的建议,通过某种密钥实现伪安全将是一种让人们更难查看页面的好方法,即使没有办法真正阻止调用。
此外,在您的 Ajax 调用中添加一个标头并在您的后端脚本中验证该标头的存在使得欺骗变得有点困难。
另一个想法是,如果每个页面视图只调用一次该服务,您可以在您的 javascript 中设置一个由服务器提供的密钥,以附加到您的 ajax 调用。调用服务器时,提供的密钥在使用后失效,防止有人使用相同的密钥调用服务两次。
没有办法(可靠地)识别浏览器,因为任何不是某种形式的“身份验证令牌”都可以被伪造。服务器依赖客户端诚实。
您可以检测请求是否是 ajax 请求。这是一种方法的链接:
http://davidwalsh.name/detect-ajax
他是这样做的:
/* AJAX check */
if(!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') {
/* special ajax here */
die($content);
}
您将需要反转 if 中的语句,因为它die()
是当请求是 ajax 时。
还有其他检测 ajax 的方法,它们都不是 100% 安全的,包括您设置一个 GET 变量来帮助您识别 ajax 调用(但是该 get 变量也可以通过浏览器通过地址行发送,非常好......你得到图片)
简短的回答:你不能。
长答案:您可以实现一个简单的Browser Sniffing。或者搜索更高级的方法。
$browser = get_browser(null, true);
if ($browser[parent] == "whatever-identifies-clients-that-have-access") {
//Code to output jSon here.
}
else {
header('HTTP/1.1 403 Forbidden');
}
但请注意,这不是安全性。最多,它会抛出一个障碍;但预防是不可能的。
编辑这假设客户端不是浏览器,我错误地假设某种(移动)客户端正在访问 JSON。当它是浏览器时,您不能拒绝访问。完全没有。AJAX 也来自那个浏览器。