我正在处理实时天气数据页面。我们的天气模块以CSV格式输出数据并将其存储在我的网络服务器上。然后,我使用PHP脚本将CSV转换为数组,然后使用JSON对其进行编码并输出,以便我的jQuery Ajax脚本可以经常调用它以获取最新数据并更新页面。到目前为止,这种方法很有效。
我的问题是,如何阻止用于检索JSON(上述PHP脚本的URL)的URL在浏览器中打开和查看?我尝试调整权限,但没有成功。
提前感谢任何愿意提供帮助的人。
答案 0 :(得分:3)
没有真正的方法可以做到这一点,因为Ajax调用也来自浏览器。正确的浏览器调用和Ajax调用之间没有真正的区别。 GET呼叫是GET呼叫。
修改的
根据@ Adeneo的建议,通过某种密钥实现伪安全性将是让人们更难以查看页面的好方法,即使没有办法字面上阻止了电话。
此外,在Ajax调用中添加标头并验证后端脚本中是否存在该标头会使欺骗更加困难。
另一个想法是,如果每个页面视图只调用一次该服务,您可以在服务器提供的javascript中设置一个密钥,以附加到您的ajax调用。当服务器被调用时,提供的密钥在使用后变为无效,从而阻止某人使用相同的密钥两次调用服务。
答案 1 :(得分:1)
没有办法(可靠地)识别浏览器,因为任何形式的“身份验证令牌”都不能伪造。服务器诚实地依赖客户端。
您可以检测请求是否是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);
}
当请求为ajax时,您将要反转if die()
中的语句。
还有其他方法可以检测ajax,其中没有一种是100%安全的,包括你设置一个GET变量来帮助你识别一个ajax调用(但是这个get变量也可以通过浏览器通过地址线很好地发送......你得到了照片)
答案 2 :(得分:0)
简短的回答:你做不到。
答案很长:你可以实现一个简单的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也来自该浏览器。