2011-09-22 72 views
0

我正在製作一個函數,以便我可以使用通用函數在Ajax中傳遞參數,以避免必須爲每個Ajax函數創建一個php文件。PHP:如何在這裏使用params?

這是我的功能看起來如何,現在在PHP端接收後,通過後,就可以在代碼中看到的PARAMS:

$class_name = $_POST['class_name']; 
$function_name = $_POST['function_name']; 
$params = "'" . implode("','", $_POST['params']) . "'"; 
$model = new $class_name(); 

//Apply the function 
echo $model->$function_name($params); 

據工作除了從則params的一部分。 PHP將它解釋爲一個參數,我該怎麼做才能讓$ params不被解釋爲單個字符串?

+3

這段代碼允許執行相當危險的任意代碼。我希望這是一個簡化的例子,刪除類和方法名稱的白名單檢查。 – johannes

+0

不完全是任意的;它必須是一個定義(或自動加載)類的方法。 (例如,你不能調用一些全局的'makeMeAnAdmin()'函數)。但是,如果沒有某種白名單(或者至少是類中的一個'isCallable'變量/方法,這可能是危險的,一種分佈式白名單)。 – cHao

回答

3

第三行實際上使得$params包含所有PARAMS一個字符串。

根據您的框架(以及您如何將參數傳遞到您的Ajax內容中),您可能可以將$_POST['params']按原樣傳遞給方法,而不是傳遞$params。在這種情況下,你根本不需要構建字符串。

如果需要調用需要的PARAMS要單獨傳遞,而不是像一個數組的功能,嘗試

​​

如果$params包含1,2,3,和$function_name是' foo',上述表達式將相當於$model->foo(1, 2, 3)

請注意,這會讓人們調用任何可用於腳本的類的公共方法。您需要某種訪問控制才能防止人們隨意運行。正如您對問題的評論中所建議的那樣,某種類型的白名單(即使它只是一個成員變量,表示該類是否意味着被像這樣的隨機代碼使用)將大大有助於防止安全問題。

+0

謝謝!正是我需要的! – luqita

0

不要撞擊它們。將它們作爲數組傳遞,就好像$_POST一樣。

echo $model->$function_name($_POST['params']); 
+0

這將意味着修改功能,這不是想法...一些功能接收3個參數,其他功能4,這必須靈活 – luqita

+1

這可能是。但是你的問題問到如何使$ params不被解釋爲單個字符串。通過執行implode,可以使$ params成爲單個字符串。 –