检测PHP文件是否直接加载

时间:2010-11-18 15:46:44

标签: php

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

如果我要使用AJAX加载该页面,它可以正常工作,但是如果用户尝试通过键入该URL直接加载文件,那么它将通过错误进行,例如。

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

4 个答案:

答案 0 :(得分:5)

您可以查找HTTP_X_REQUESTED_WITH标题。

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

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

但请注意,它不是标准的,但需要在请求方明确设置。 AFAIK,至少jQuery和Mootools设置了它,可能大多数其他设置它,但不要相信我的话。

答案 1 :(得分:5)

这是不可能的。你不能依赖$_SERVER['HTTP_X_REQUESTED_WITH'],即使你可以,也没关系。任何人都可以通过POSTGET将相同的请求发送到您的浏览器所执行的服务器。

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

同样,不可能来保护这样的东西。您应该验证会话并请求数据。就是这样。

答案 2 :(得分:2)

最简单的方法是仅通过POST访问该网页,而不是通过GET访问该网页。虽然记住 - 如果浏览器可以做到 - 那么黑客也可以。

答案 3 :(得分:1)

您必须使用会话变量,或者更常见的是 Cookie。

使用Cookie:(在JavaScript中设置)

  1. JavaScript:在Cookie中设置令牌
  2. JavaScript:Make XMLHttpRequest
  3. 服务器端:检查来自cookie的令牌
  4. 服务器端:返回JSON输出或错误消息
  5. 请注意这不安全!这只是为了防止轻松链接。

    使用会话变量:(在服务器端设置的Cookie)

    1. 服务器端:验证用户,设置权限
    2. JavaScript:Make XMLHttpRequest
    3. 服务器端:检查权限
    4. 服务器端:返回JSON输出或错误消息
    5. 此方法与用户身份验证一样安全。