使用 ajax 时无法识别 PHP 常量


php constant not recognized when using ajax

我想限制对 php 文件的访问,以便只有其他 php 文件可以访问它。restricted.php,我添加了以下检查:

if (!defined('myvar')) { exit(); }

index.php中,我这样定义myvardefine('myvar', true);

当我使用 include 'restricted.php'; 时,

这有效,但当我尝试使用 ajax 访问页面时,我被拒绝访问。这是意料之中的吗?

$.ajax({
   url: "restricted.php",
   dataType: "text",
   success: function(data) {
   //use data
   }
});

是的,这是您发布的内容所期望的。就像Paul Denisevich所说,javascript是客户端,PHP是服务器端,所以就限制而言.php你的ajax请求可能来自任何地方。虽然你说你希望"其他php文件"能够访问它,但我的印象是你希望你的ajax能够访问它,但你不希望其他客户端脚本能够访问它。您不希望有人能够像 http://example.com/restricted.php 一样直接加载文件。

你需要一条索引.php和限制的信息.php两者都知道,但局外人不会,然后散列它。我不知道您可能对这些脚本有什么信息。如果有用户登录,也许您想对用户名和出生日期或其他内容进行哈希处理。最好使用数据库中永远不会输出到 UI 的内容并将其包含在哈希中。

例如,也许我只有一个文件:

<?php
$key = "some string" . date('DNi'); 
// weird date format that changes every minute. This is no good for production as 
// the minute may tick by during the request from the ajax to restricted.php. You 
// are better off using some values from a database that are not shown anywhere.
?>

在索引.php和受限.php中:

require_once('hash.php');

在你的 Ajax 中:

$.ajax({
   url: "restricted.php",
   dataType: "text",
   data {hash:"<?php echo md5($key) ?>"},
   success: function(data) {
   //use data
   }
});

然后在受限中,如下所示:

if($_GET['hash'] == md5($key)) {
    // do your thing and send some output for ajax to use
} else {
    // bail
}

javascript是用于客户端的,PHP是用于服务器端的,所以它没有任何共同点。您被拒绝访问是因为您尝试访问具有该if (!defined('myvar')) { exit(); }构造的restricted.php因此当您调用restricted.php时,没有定义myvar

我认为它做你想做的事,不是吗?它适用于 PHP 包含,但不适用于 Web 请求。PHP 包含是对文件的服务器端访问,而不是 Web 请求。如果我误会了,请告诉我。