出于安全原因检查常量

时间:2011-10-13 09:02:00

标签: php security

某些应用程序使用此代码作为 index.php 所包含的每页的第一行

if (!defined('SECURE_CONST')) { die("Access denied!"); }

为什么他们需要使用它?安全是否必要?如果是,我该如何正确使用它?

5 个答案:

答案 0 :(得分:4)

这可能是为了防止直接请求仅作为包含/必需文件使用的文件。

通常,常量定义在例如index.php

index.php

<?php  
define('SECURE_CONST', true);  
require('someIncludeFile.php');

someIncludeFile.php

<?php
if (!defined('SECURE_CONST')) { die("Access denied!"); }
// the actual code starts here

答案 1 :(得分:4)

这样做是为了确保不直接执行文件。例如:

/index.php

<?php
  define('SECURE_CONST', 1);
  include 'include_me.php';
?>

/include_me.php

<?php
  if (!defined('SECURE_CONST')) { die("Access denied!"); }
?>

然后,如果请求http://example.com/index.php,则会定义SECURE_CONST,因此在包含die()时不会调用include_me.php。但是,如果直接请求http://example.com/include_me.php,则永远不会定义SECURE_CONST,因此脚本会失效。

如果您的网络服务器安全配置 - 即。不打算直接访问的文件位于Web根目录之外,或者位于例如不可访问的目录中。 .htaccess - 这应该是不必要的。使用这种“安全”措施的开发人员可能会这样做,因为他们正确地假设许多使用他们软件的人不会花时间去理解安全问题并正确配置他们的服务器,因此使用这样的方法作为故障保护。

答案 2 :(得分:2)

我的猜测将会阻止加载页面而不通过index.php来定义SECURE_CONST,并在那时进行其他权限检查等。因此,定义SECURE_CONST意味着请求通过index.php,这意味着所有与权限相关的事情都会得到处理,因此请求是“可信的”。

通过正确构建应用程序/文件布局,并通过正确处理请求确保所有请求都通过某些步骤,可以更好地处理这个问题。例如,重写所有请求以调用处理请求的前端控制器。在应用程序的每一个角落都采取防御措施,正在进行一场艰苦的战斗,引入不必要的代码,如果忘掉这条线,就会导致安全漏洞。

答案 3 :(得分:0)

如果只有在执行了某些代码时才能定义此常量,例如成功的登录脚本,那么所有这些页面都会知道您已登录或以其他方式导致执行代码。

这也回答了你问题的第二部分。用户必须在这些页面工作之前执行包含常量声明的特定代码。

答案 4 :(得分:0)

非常好,但我采用了不同的方法,请查看下面的代码。

file_that_needs_security.php

<?php

    defined("START") || (header("HTTP/1.1 403 Forbidden") & die("403.14 - Directory listing denied."));

?>

然后检查它:index.php

<?php

    // Main stuff here
    defined("START") ? null : define("START", microtime());
    include "file_that_needs_security.php";

    echo "Works Fine!!!";

?>

所以当你转到file_that_needs_security.php时,它会输出:

  

403.14 - 目录列表被拒绝。

但是当你转到index.php时,它会输出:

  

工作正常!!!