2009-09-15 27 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