2009-09-15 94 views
2

我正在爲我的控制器寫一個「catch all」方法,用於ajax。這就是所謂的「AJAX」:P使用PHP的幫助method_exists()

這是它目前看起來像

public function ajax($method = null) { 

    if (! $method OR ! request::is_ajax()) { 

     return false; 

    } 


    if (method_exists(array($this, 'searchModel'), $method)) { 
     echo $this->searchModel->$method(); 

    } 

    exit; 



} 

在這種不明顯的情況下,我想了ajax先擺脫困境,如果它認爲它不是一個Ajax請求,然後檢查我的$this->searchModel以查看它是否具有作爲ajax方法的參數傳入的方法。

如果它找到了方法,它應該回顯它的返回值然後退出。

我的問題是我不能得到method_exists()找到方法!我知道它確實存在......我甚至硬編碼(用於測試目的)我確定存在的方法。

這讓我有點瘋狂,有人能告訴我我做錯了什麼嗎?

謝謝!

P.S.我正在使用Kohana框架,但我認爲這不重要。

UPDATE

你覺得我暴露內部方法名稱的JavaScript(即公衆)可能是安全的關注?

回答

4

您正在使用method_exists()的第一個參數,就像它支持回調參數一樣,但它不接受回調。它只接受一個對象實例或者一個類名(一個字符串)來測試靜態方法。

試試這個:

if (method_exists($this->searchModel, $method)) { 
    echo $this->searchModel->$method(); 
} 

重新您的第二個問題,是的,我認爲這是一個安全問題。您沒有確認請求是否完整。我不會使用您正在設計的「全面解決方案」解決方案。

+1

謝謝比爾!如果我做了這樣的事情,你認爲它會使它安全嗎?$ method ='ajax_'。 $ method'.i.e。 'ajax_'前綴將確保他們不能訪問我的模型的任何其他方法? – alex 2009-09-15 01:03:28

+0

我實際上更關心* do *調用ajax方法的惡意請求,而不是調用非ajax方法的請求。 – 2009-09-15 01:32:53

+0

那麼這個模型只處理用戶搜索 - 它應該是安全的。 – alex 2009-09-15 01:34:17

2

我覺得你的代碼應該說:

if(method_exists($this->searchModel, $method)) 
    echo $this->searchModel->$method(); 

然而,一個壞主意,你searchModel對象的所有方法暴露給世界,所以你應該前綴與AJAX方法「ajax_」或相似的,所以它是唯一可能的調用方法與前綴的東西:

// given that $method is 'user_login' ... 
$realMethod = 'ajax_' . $method;  
if(method_exists($this->searchModel, $realMethod)) 
    // calls $this->searchModel->ajax_user_login(); 
    echo $this->searchModel->$realMethod(); 
+0

你讀了我的頭腦與前綴的東西!感謝您的回答。 – alex 2009-09-15 01:06:13