我最近浏览了一些php源代码,特别是像phpbb和esotalk
这样的论坛软件我注意到一件事,他们中的大多数在页面的开头使用了一个全局变量作为某种安全性,如下所示:
if (!defined("IN_ESOTALK")) exit; //For esotalk
if (!defined("IN_PHPBB")) exit; //FOR phpbb
这是什么安全措施?我不明白。 你能解释一下这会阻止什么以及如何预防?
感谢, Vidhu
答案 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)
这些是全局常量。通过这些,他们可以确保他们的软件正常运行。