我最近在浏览一些 php 源代码,尤其是 phpbb 和 esotalk 之类的论坛软件
我注意到一件事,他们中的大多数人在页面开头使用了一个全局变量作为某种安全性,如下所示:
if (!defined("IN_ESOTALK")) exit; //For esotalk
if (!defined("IN_PHPBB")) exit; //FOR phpbb
这是一种什么样的安全感?我不明白。你能向我解释一下这会阻止什么以及如何阻止吗?
谢谢, 维杜
它的工作原理是确保除非框架启动,否则 php 脚本不会运行。这样用户就不能在不经过正确页面的情况下执行脚本。
这是一个例子。我们有 2 个文件:
索引.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 提出了一个很好的观点:如果您以前没有看过定义,它定义了一个无法更改的常量。用户对 PHP 文档的贡献有助于理解其工作原理。
这些是全局常量。有了这些,他们可以确保他们的软件按预期运行。
这也可以防止使用 register_globals 进行变量操作。
如果在 php.ini 中启用了 register_globals,用户可以通过更改 URL 中的变量来修改脚本中的变量,但这不允许他们修改使用 define 函数定义的常量变量的值