如何阻止我的用户直接访问仅针对ajax调用的页面?
在ajax调用期间传递密钥似乎是一种解决方案,而不使用密钥的访问将不会被处理。但是制作钥匙也很容易,不是吗?观点诅咒......
p / s:使用Apache作为网络服务器。
编辑:为了回答原因,我在index.php中有jQuery ui-tabs,在这些选项卡中是带有脚本的表单,如果直接访问它们将无法正常工作。为什么用户会想要这样做,我不知道,我只是想通过阻止直接访问没有验证脚本的表单来提高用户友好性。答案 0 :(得分:34)
无法保证他们通过AJAX访问它。直接访问和AJAX访问都来自客户端,因此很容易伪造。
为什么你要这样做呢?
如果是因为PHP代码不是很安全,那么使PHP代码更安全。 (例如,如果您的AJAX将用户ID传递给PHP文件,请在PHP文件中编写代码以确保它是正确的用户ID。)
答案 1 :(得分:21)
正如其他人所说,可以模拟Ajax请求创建正确的标头。 如果您想要进行基本检查以查看请求是否是Ajax请求,您可以使用:
if($_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest') {
//Request identified as ajax request
}
但是,您不应该将此安全性作为此检查的依据。如果这是你需要的,它将消除对页面的直接访问。
答案 2 :(得分:8)
听起来你可能会以错误的方式处理事情。 AJAX调用就像标准页面请求一样,只有按照惯例,响应才不会显示给用户。
但是,它仍然是客户端请求,因此您必须很高兴客户能够看到响应。以这种方式使用“密钥”模糊访问只会使事情变得复杂。
我实际上说,观察源的“诅咒”是通过默默无闻来对抗安全的小武器。
那么你想要这样做的原因是什么?
答案 3 :(得分:4)
如果浏览器会通过普通请求或ajax调用您的页面,那么有人可以手动调用它。就服务器 - 客户端通信而言,正常请求和ajax请求之间确实没有明确的区别。
常见的情况是将标头传递给服务器,上面写着“此请求是由ajax完成的”。如果您正在使用Prototype,它会自动将http标头“X-Requested-With”设置为“XMLHttpRequest”以及其他一些标头,包括原型版本。 (请参阅http://www.prototypejs.org/api/ajax/options处的“requestHeaders”)
添加:如果你正在使用另一个AJAX库,你可以添加自己的标题。这对于了解服务器端的请求类型以及避免在浏览器中请求ajax页面时的简单情况非常有用。它不能保护您的所有人的请求,因为您不能。
答案 4 :(得分:1)
COOKIES不安全...试试$ _SESSION。这几乎是你可以真正依赖的跨页面中无法欺骗的东西之一。因为,当然,它基本上永远不会让你失控。
答案 5 :(得分:1)
谢谢,尽管我使用
define('IS_AJAX', isset($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest');
if(IS_AJAX) {
//Request identified as ajax request
}
喝彩!
答案 6 :(得分:0)
对此不确定,但可能会检查引荐来源标头?我想如果有人手动输入你的网址,它就没有引用标题,而AJAX则会这样做(至少在我刚刚在系统上进行的快速测试中)。
这是一种不好的检查方法。由于很多原因,推荐人可能是空白的。您是否试图阻止人们将您的网络服务用作公共服务或什么?
在阅读完编辑评论之后,如果表格将通过ajax调用加载,那么你可以检查window.location以查看url是否是你的ajax表单的url。如果是,请通过document.location转到右侧页面
答案 7 :(得分:0)
这绝对没有用于保护某些内容..但我认为如果你想说一个生成整页的php页面,如果ajax没有请求该页面但只生成那个部分,那么这可能是有用的你需要在使用ajax时返回..这将允许你使你的网站非ajax友好所以如果说他们点击一个链接,它应该加载一盒评论,但他们没有ajax它仍然将它们发送到页面,然后生成为显示评论的整个页面。
答案 8 :(得分:0)
通过index.php传递您的直接请求,并通过ajax.php传递您的ajax请求,然后不要让用户直接浏览到任何其他源文件 - 确保index.php和ajax.php具有适当的逻辑来包含他们需要的代码。
答案 9 :(得分:0)
在调用脚本的javascript文件中:
var url = "http://website.com/ajax.php?say=hello+world";
xmlHttp.open("GET", url, true);
xmlHttp.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
然后在php文件中ajax.php:
if($_SERVER['HTTP_X_REQUESTED_WITH'] != "XMLHttpRequest") {
header("Location: http://website.com");
die();
}
Geeks仍然可以通过伪造标头调用ajax.php脚本,但我的脚本的其余部分需要会话,因此在没有检测到有效会话时执行结束。我需要这个工作,以便将过期的hybridauth会话的人重定向到主站点,以便再次登录,因为他们最终被重定向到ajax脚本。