我想限制对 php 文件的访问,以便只有其他 php 文件可以访问它。restricted.php
,我添加了以下检查:
if (!defined('myvar')) { exit(); }
在index.php
中,我这样定义myvar
:define('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 请求。如果我误会了,请告诉我。