6

我最近在浏览一些 php 源代码,尤其是 phpbb 和 esotalk 之类的论坛软件

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

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

这是一种什么样的安全感?我不明白。你能向我解释一下这会阻止什么以及如何阻止吗?

谢谢, 维杜

4

3 回答 3

7

它的工作原理是确保除非框架启动,否则 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 文档的贡献有助于理解其工作原理。

于 2013-01-01T21:59:45.827 回答
1

这些是全局常量。有了这些,他们可以确保他们的软件按预期运行。

于 2013-01-01T22:05:17.260 回答
1

这也可以防止使用 register_globals 进行变量操作。

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

于 2013-01-01T22:02:30.770 回答