2010-11-09 69 views
0

我想編寫一個編程環境。我會用一個例子來解釋它。僅使用PHP提供特定功能和變量

一位程序員將編寫該代碼;

<html> 
<head> 
    <?php definedMetaTags(); ?> 
</head> 
</body> 

程序員將保存此文件,然後上傳到我的系統。該文件將在服務器端執行,然後他們的系統會將生成的代碼恢復。

這definedMetaTags()函數將已經寫入系統。

Compiler.php的例子:

<?php 
require_once("definitionsForProgrammer.php"); 
include("uploadedfile.php"); 
?> 

我的問題是,我想只允許uploadedfile.php我想要的功能。否則,也許程序員會寫一些我希望他/她做的代碼。 (刪除文件,MySQL連接等)

有沒有什麼辦法可以讓一個代碼只特定的函數,變量的constans?

+1

您是否考慮過XMLRPC或SOAP用於此目的? – stillstanding 2010-11-09 17:18:55

+0

我實際上希望代碼首先發送給我(到服務器)。我不希望用戶發送請求並採取響應。 – tcak 2010-11-09 20:58:27

回答

1

如果你的目標的安全和你想要讓他們寫的功能,那麼簡單的答案是:沒有。

基本上你問一個PHP沙箱可以讓你限制可以執行哪些代碼。 PHP必須從根本上支持它才能運行。例如,假設你採用了「我只允許用戶寫一個名爲'foo'的函數」的方法。在該函數內部,儘管用戶可以做各種不好的事情,比如進行系統調用,下載其他代碼並執行它等。爲了防止這種情況,您需要在系統中實現更低級別的檢查。

如果你願意限制範圍僅變量定義則是你可以做到這一點。您可以使用token_get_all()和token_name()來檢查該文件,以確保它沒有任何您不需要的代碼。例如:

foreach (token_get_all(file_get_contents("uploadedfile.php")) as $token) { 
    if (is_array($token)) { 
    echo token_name($token[0]), " "; 
    } else { 
    echo $token; 
    } 
} 

如果你不喜歡你所看到的任何標記,不包括該文件。理論上你可以用這種方式來防止不好的功能,但是需要付出相當大的努力才能正確解析文件並確保它們不會造成不好的結果。

引用:

+0

會防範變量變量嗎? – 2010-11-09 20:26:38

+0

如果你問我的答案是肯定的,我也想要變量的安全性。因爲你知道$ _SERVER中有很多信息,以及我現在不記得的其他變量。 – tcak 2010-11-09 20:55:26

1

那麼,如果我正確地理解你的問題。如果你包含(「uploadedfile.php」);您將獲得其中的所有內容

你可以做的是將你的代碼分解成相關的部分(無論是通過類還是僅僅是文件中的函數定義),然後只包含你想要的文件/類。

(讓我知道這不是你問什麼)

+0

我會結合你的思想(階級)和巴拉特的方式。所以,我只允許用戶使用該類的變量和函數。如果它運作良好,我會告訴你。 – tcak 2010-11-09 20:57:00

2

如果目標是允許用戶插入,將通過一些PHP函數執行代替佔位符,然後有無需將上傳的文件視爲PHP代碼:

<html> 
<head> 
    {[definedMetaTags]} 
</head> 
</body> 

然後Compiler.php應該是這樣的:

<?php 
require_once("definitionsForProgrammer.php"); 

$macros = array(); 
$macros['definedMetaTags'] = definedMetaTags(); 

$output = file_get_contents("uploadedfile.php"); 
foreach($macros as $macro=>$value) $output = str_replace("{[$macro]}", $value, $output); 

echo $output; 
?> 

definedMetaTags()功能需要返工,以便它返回的標籤作爲一個字符串,而不是直接將它們打印輸出的。

這種方法可以讓你定義任意數量的宏,而不會讓你自己面臨其他人提到的所有安全風險。

+0

Schwartzie,你的方式很好,但問題是我會用很多編程語言來使用這個東西。 C++,Java,Javascript,Html,Python等。因此,str_replace有時可能對不同的語言工作有誤。是的,HTML通常不會使用{[...]}風格,但我們可以看到其他語言的風格編碼。實際上這是問題。 – tcak 2010-11-09 21:01:15

+0

您的應用程序是否有名稱?只要使用它或其他合理的不同字符串作爲宏的前綴:'{[TolgaApp_definedMetaTags]}'。雖然這不會避免與任意語言的語法衝突,但它肯定會避免無意的衝突,並且只會對用戶產生合理的限制。 – Schwartzie 2010-11-10 02:29:10