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

时间:2013-12-05 18:59:46

标签: php

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

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

下面的例子看起来像是默默无闻的安全,因为任何人都可以将$_POST[$variable]设置为他们想要的东西。

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

/* AND */

if (empty($_POST)) {
  exit("Direct access not allowed");
}

但是使用define函数来阻止直接访问呢?设置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');

3 个答案:

答案 0 :(得分:4)

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

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

现在只需重命名包含文件.inc.php,不允许从外部访问。

这样可以节省对代码的无意义修改。

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

答案 1 :(得分:2)

$_SERVER['SCRIPT_FILENAME']是当前正在执行的脚本的绝对路径名。

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

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

答案 2 :(得分:1)

在第一个示例中,用户可以修改POST字段的值(如果他们选择这样),因此他们可以绕过限制。在第二个示例中,您是定义值的那个,并且最终用户无法执行任何操作来修改常量,因此它(更)安全。第三个例子实际上与第二个例子相同,但是,定义一个常量更有意义,因为值总是一个常量。