【问题标题】:php - website security using global variablephp - 使用全局变量的网站安全性
【发布时间】:2012-12-16 09:07:58
【问题描述】:

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

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

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

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

谢谢, 维杜

【问题讨论】:

  • 这是为了防止从应用程序外部访问脚本

标签: php security forum phpbb


【解决方案1】:

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

【讨论】:

  • 你应该提到这些是常量而不是变量。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2021-03-10
      • 1970-01-01
      • 1970-01-01
      • 2011-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多