检测是否直接加载PHP文件

检测是否直接加载PHP文件,php,Php,我正在使用一些PHP页面做一些AJAX的事情,但我不希望它们可以直接访问。Facebook也做了类似的事情,例如:domain.com/ajax/my_ajax\u form.php 如果我使用AJAX加载该页面,它会工作得很好,但是如果用户试图通过键入url直接加载该文件,则会出现错误,例如 if( IS FILE LOADED DIRECT? ) { header ( HTTP/1.0 404 ); } 最简单的方法是只通过POST访问该页面,而不是通过GET。不过请记住,如果浏览器可以做

我正在使用一些PHP页面做一些AJAX的事情,但我不希望它们可以直接访问。Facebook也做了类似的事情,例如:domain.com/ajax/my_ajax\u form.php

如果我使用AJAX加载该页面,它会工作得很好,但是如果用户试图通过键入url直接加载该文件,则会出现错误,例如

if( IS FILE LOADED DIRECT? )
{
header ( HTTP/1.0 404 );
}

最简单的方法是只通过
POST
访问该页面,而不是通过
GET
。不过请记住,如果浏览器可以做到这一点,那么黑客也可以做到。

您可以查找带有标题的
HTTP\u X\u REQUESTED\u

$is_ajax = array_key_exists('HTTP_X_REQUESTED_WITH', $_SERVER) 
           && $_SERVER['HTTP_X_REQUESTED_WITH'] === 'XMLHttpRequest';

if (! $is_ajax) {
    die('go away.');
}

但是请注意,它不是标准的,但需要在请求端显式设置。好吧,至少jQuery和Mootools设置了它,可能其他大多数也设置了它,但不要相信我的话。

这是不可能的。您不能依赖
$\u服务器['HTTP\u X\u REQUESTED\u WITH']
,即使您可以,这也没关系。任何人都可以通过
POST
GET
向您的服务器发送与浏览器相同的请求

您应该做的是验证请求,如果请求有效,则返回正确的结果。如果无效,请不要返回404。(浏览器可以缓存404之类的错误。如果客户端代码出现问题,后续请求可能会失败!)如果请求无效,则返回某种类型的错误

再说一次,像这样的东西是不可能安全的。您应该验证会话和请求数据。仅此而已。

您必须使用会话变量,或者更一般地说,cookie

与cookies:(在JavaScript中设置)

  • JavaScript:在cookie中设置令牌
  • JavaScript:生成XMLHttpRequest
  • 服务器端:检查来自cookie的令牌
  • 服务器端:返回JSON输出或错误消息
  • 请注意,这是不安全的!这只会阻止轻松链接

    带有会话变量:(cookies设置在服务器端)

  • 服务器端:验证用户,设置权限
  • JavaScript:生成XMLHttpRequest
  • 服务器端:检查权限
  • 服务器端:返回JSON输出或错误消息

  • 此方法与用户身份验证一样安全。

    让它限制对文件的访问的原因是什么?通常直接访问意味着,只要调用文件
    ajax.php
    ,我就会让它默认为一条错误消息,除非他们添加GET或POST变量,比如
    ajax.php?method=getData
    +1我完全同意,如果它被ajax请求使用,只要从这个角度确保它是安全的,并确保输出是什么。我不会把时间浪费在阻止非ajax请求上。如果你能自己掌握所有线程,你当然可以信赖它。尽管如此,标题在任何方面都不是一个标准,但仍然是常见的做法。无论如何,应用程序的安全性应该在应用程序的较低级别上处理,而不是根据访问方法拒绝对资源的访问。