2013-01-01 248 views
6

我最近瀏覽一些PHP源代碼,論壇之類的軟件的phpBB特別是那些和esotalkPHP - 使用全局變量

我注意到一件事網站的安全性,其中大部分使用的全局變量在他們的頁面開始作爲某種類型的安全像這樣:

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

這是什麼樣的安全性?我不明白。 你能向我解釋一下這可以防止以及如何?

感謝, Vidhu

+2

這可以防止從應用程序外部訪問腳本 – SaidbakR

回答

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提出了一個很好的觀點:如果您之前沒有見過定義,它定義了一個不能改變的常量。 user contributions to the PHP documentation可以幫助理解它的工作原理。

+2

您應該提到這些是常量而不是變量。 – Gumbo

1

這也可以通過使用register_globals來防止變量操作。

如果在php.ini中啓用了register_globals,用戶可以通過更改URL中的變量來修改腳本中的變量,但這不會允許它們修改使用define函數定義的常量變量的值

1

這些是全局常量。有了這些,他們確保他們的軟件正在運行它的目標。