防止直接访问PHP页面

如何防止我的用户直接访问仅用于Ajax调用的页面?

在ajax调用期间传递一个密钥似乎是一个解决scheme,而没有密钥的访问将不会被处理。 但是制作钥匙也很容易,不是吗? 查看源代码的诅咒…

p / s:使用Apache作为networking服务器。

编辑:为了回答为什么,我有我的index.php jQuery的UI标签,并在这些标签是与脚本的forms,这将无法正常工作,如果他们直接访问。 为什么用户想要这样做,我不知道,我只是想通过阻止直接访问没有validation脚本的表单来更友好的用户。

正如其他人所说,Ajax请求可以模拟创建正确的标题。 如果您想要进行基本检查,以查看请求是否是Ajax请求,则可以使用:

if($_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest') { //Request identified as ajax request } 

但是,您绝对不应该将您的安全基于此检查。 这将消除直接访问页面,如果这是你所需要的。

没有办法保证他们通过AJAX访问它。 直接访问和AJAX访问都来自客户端,所以很容易被伪造。

为什么你要这样做呢?

如果是因为PHP代码不是很安全,那么使PHP代码更安全。 (例如,如果您的AJAX将用户标识传递给PHP文件,请在PHP文件中编写代码以确保这是正确的用户标识。

这听起来像你可能会以错误的方式去做事情。 一个AJAX调用就像一个标准的页面请求,只是按照惯例,这个响应不打算显示给用户。

但是,这仍然是客户的要求,所以您必须乐意让客户看到回应。 以这种方式使用“密钥”来混淆访问只会使事情变得复杂。

实际上,我认为查看来源的“诅咒”是通过默默无闻的手段打击安全的一个小武器。

那么你想要这样做的原因是什么?

如果浏览器会通过普通的请求或Ajax调用你的页面,那么有人可以手动调用它。 就服务器 – 客户端通信而言,在正常和ajax请求之间确实没有明确的区别。

常见的情况是将一个头部传递给服务器,表示“这个请求是由ajax完成的”。 如果你正在使用Prototype,它会自动设置http头“X-Requested-With”为“XMLHttpRequest”,还有一些其他头文件,包括原型版本。 (请参阅http://www.prototypejs.org/api/ajax/options上的“requestHeaders”处的更多内容)

添加:如果你使用另一个AJAX库,你可以添加自己的头文件。 这对于了解服务器端是什么类型的请求以及避免在浏览器中请求ajax页面的简单情况很有用。 它不能保护你的要求,因为你不能。

COOKIES不安全…尝试$ _SESSION。 这几乎是您实际上可以依赖的不能被欺骗的跨页面的东西之一。 因为,它当然从来没有离开过你的控制。

谢谢,尽管我使用

 define('IS_AJAX', isset($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest'); if(IS_AJAX) { //Request identified as ajax request } 

干杯!

不确定这一点,但可能检查一个引用头文件? 我想如果有人手动输入你的网址,它不会有引用标题,而AJAX调用(至少在我刚刚在我的系统上做的快速测试)。

这是一个不错的检查方式。 推荐人可以是空白的原因很多。 你是否试图阻止人们使用你的网络服务作为公共服务或什么?

在阅读你的编辑注释之后,如果表单将通过ajax调用加载,那么你可以检查window.location来查看url是否是你的ajax表单的url。 如果是,请通过document.location转到正确的页面

这绝对没有用的东西..但是我认为这可能是有用的,如果你想有一个PHP页面生成一个完整的页面,如果该页面不是由AJAX请求,但只生成你需要的部分返回当使用ajax ..这将允许您使您的网站非AJAX友好,所以如果说他们点击一个链接,它应该加载一个评论框,但他们没有AJAX它仍然将它们发送到页面然后生成显示评论的整个页面。

通过index.php和你的ajax请求通过ajax.php传递你的直接请求,然后不要让用户直接浏览到任何其他源文件 – 确保index.php和ajax.php有合适的逻辑来包含他们需要的代码。

在调用脚本的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(); } 

极客们仍然可以通过伪造标题来调用ajax.php脚本,但脚本的其余部分需要会话,因此在没有检测到有效会话时执行结束。 我需要这个工作,以便将过期的hybridauth会话重定向到主站点,以便再次登录,因为他们最终被重定向到ajax脚本。