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

Kri*_*son 6 php security forum phpbb

我最近浏览了一些php源代码,特别是像phpbb和esotalk这样的论坛软件

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

if (!defined("IN_ESOTALK")) exit; //For esotalk
if (!defined("IN_PHPBB")) exit; //FOR phpbb
Run Code Online (Sandbox Code Playgroud)

这有什么安全感?我不明白.你能解释一下这会阻止什么,怎么样?

谢谢,Vidhu

Lev*_*evi 7

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

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

的index.php

<?php
     define("_MY_FRAMEWORK", 1);
     echo 'started';
     require('script.php');
?>
Run Code Online (Sandbox Code Playgroud)

和script.php

<?php
    if (!defined("_MY_FRAMEWORK")) exit;
    echo "my script";
?>
Run Code Online (Sandbox Code Playgroud)

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

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

@Gumbo提出了一个很好的观点:如果你之前没有见过define,它定义了一个无法改变的常量.在PHP文档的用户贡献可以帮助理解它是如何工作的.

  • 你应该提到这些是常量而不是变量. (2认同)