防止直接访问,是否可以欺骗php定义?

防止直接访问,是否可以欺骗php定义?,php,Php,我想阻止直接访问我的header.php和footer.php文件 我知道有很多关于如何防止直接访问的问题,但是没有一个能真正解释这些方法的安全性 下面的例子似乎是通过模糊来实现安全,因为任何人都可以将$\u POST[$variable]设置为他们想要的值 if (!isset($_POST['field'])) { die(); } /* AND */ if (empty($_POST)) { exit("Direct access not allowed"); } 但是使用d

我想阻止直接访问我的
header.php
footer.php
文件

我知道有很多关于如何防止直接访问的问题,但是没有一个能真正解释这些方法的安全性

下面的例子似乎是通过模糊来实现安全,因为任何人都可以将
$\u POST[$variable]
设置为他们想要的值

if (!isset($_POST['field'])) {
  die();
}

/* AND */

if (empty($_POST)) {
  exit("Direct access not allowed");
}
但是使用
define
功能来阻止直接访问怎么样?如果有人设置
定义
,这会更安全吗

差不多

// index.php
define("DIRECTACCESS", "NO");
include 'header.php';

// header.php
if(DIRECTACCESS == "NO")
   die('No direct access allowed');
或者我甚至可以这样做:

// index.php
$daccess = 'NO';
include 'header.php';

// header.php
if(!isset($daccess))
   die('No direct access allowed');

在第一个示例中,用户可以修改
POST
字段的值(如果选择),因此可以绕过限制。在第二个示例中,您是定义值的人,最终用户无法对常量进行任何修改,因此它(更)安全。第三个示例实际上与第二个示例相同,但是,定义常量更有意义,因为该值始终是常量。

是当前执行脚本的绝对路径名

是文件的完整路径和文件名

if (realpath($_SERVER['SCRIPT_FILENAME']) == realpath(__FILE__)) {
    die('No direct access allowed');
}

只需使用.htaccess文件。这将阻止外部访问,但仍将允许包括:

<Files ~ "\.inc\.php$">
    Order allow,deny
    Deny from all
</Files>

命令允许,拒绝
全盘否定
现在只需重命名include files.inc.php,就不允许从外部访问

这样可以避免对代码进行无意义的修改


最好是将include文件移出文档根(
include('../includes/header.php');
)并从那里包含它们,这样会自动禁止直接访问。

除非您编写了极其愚蠢的代码,否则决不能伪造
define
调用。同样,如果您使用htaccess阻止它,它也是完全安全的(因为PHP仍然可以访问它,但用户不能)。您显示的第二个代码块很好。防止直接访问header.PHP和footer.PHP文件的最简单方法是通过“直接访问”将它们移到htdocs文档根目录及其子目录之外,你的意思是HTTP GET,并且你想要一个HTTP POST-only脚本吗?定义确实是一种方式,因为它们不会被代码意外操纵,它们不受范围的影响,等等。用一个定义——所有大项目都是这样做的。你能详细说明一下这里发生了什么吗?你是说
php
而不是
pho
?我很喜欢这个答案,因为只要看一下文件名就很容易看出哪些文件不能访问:
.inc.php