php - 使用全局变量的网站安全性

时间:2013-01-01 21:56:49

标签: php security forum phpbb

我最近浏览了一些php源代码,特别是像phpbb和esotalk

这样的论坛软件

我注意到一件事,他们中的大多数在页面的开头使用了一个全局变量作为某种安全性,如下所示:

if (!defined("IN_ESOTALK")) exit; //For esotalk
if (!defined("IN_PHPBB")) exit; //FOR phpbb

这是什么安全措施?我不明白。 你能解释一下这会阻止什么以及如何预防?

感谢, Vidhu

3 个答案:

答案 0 :(得分:7)

它的工作原理是确保php脚本不会运行,除非框架已启动。这样,用户无法通过正确的页面就无法执行脚本。

这是一个例子。我们有2个文件:

的index.php

<?php
     define("_MY_FRAMEWORK", 1);
     echo 'started';
     require('script.php');
?>

和script.php

<?php
    if (!defined("_MY_FRAMEWORK")) exit;
    echo "my script";
?>

如果直接运行script.php,则不会发生任何事情,因为尚未定义_MY_FRAMEWORK。它会退出。

但是,如果运行包含script.php的index.php,脚本将继续,因为您首先定义了_MY_FRAMEWORK。您将获得完整输出:started后跟my script

@Gumbo提出了一个很好的观点:如果您之前没有见过define,它会定义一个无法更改的常量。 user contributions to the PHP documentation有助于了解其工作原理。

答案 1 :(得分:1)

这也可以通过使用register_globals来防止变量操作。

如果在php.ini中启用了register_globals,用户可以通过更改URL中的变量来修改脚本中的变量,但这不允许他们修改使用define函数定义的常量变量的值< / p>

答案 2 :(得分:1)

这些是全局常量。通过这些,他们可以确保他们的软件正常运行。