1

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

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

index.phpmyvar这样定义:define('myvar', true);

这在我使用时有效,include 'restricted.php';但当我尝试使用 ajax 访问页面时被拒绝访问。这是预期的吗?

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

3 回答 3

1

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

你需要一条 index.php 和restricted.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.
?>

在 index.php 和 restricted.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
}
于 2013-10-11T03:51:14.227 回答
0

javascript用于客户端,PHP用于服务器端,因此没有共同之处。您被拒绝访问,因为您试图访问restricted.php具有该结构的访问,if (!defined('myvar')) { exit(); }因此当您调用时restricted.php没有myvar定义。

于 2013-10-11T02:42:25.853 回答
0

我认为它做你想做的,不是吗?它适用于 PHP 包含,但不适用于 Web 请求。PHP 包含是对文件的服务器端访问,而不是 Web 请求。让我知道我是否有误解。

于 2013-10-11T02:42:35.823 回答