Coldfusion 实现oncfcrest()时,可以远程访问公共函数

Coldfusion 实现oncfcrest()时,可以远程访问公共函数,coldfusion,coldfusion-9,Coldfusion,Coldfusion 9,一些背景: 我正在使用oncfcrest()分别处理与常规CFM页面请求不同的远程CFC调用。这使我能够捕获错误并为所有远程请求干净地设置MIME类型 问题: 我不小心将一些远程CFC功能设置为publicaccess,而不是remote,并意识到远程调用时它们仍在工作 正如您在下面看到的,我的oncfcrest()实现在我的整个应用程序中创建了一个巨大的安全漏洞,其中HTTP请求可用于调用任何HTTP可访问CFC上的任何public方法。 复制代码: 在Application.cfc中:

一些背景:

我正在使用
oncfcrest()
分别处理与常规CFM页面请求不同的远程CFC调用。这使我能够捕获错误并为所有远程请求干净地设置MIME类型

问题:

我不小心将一些远程CFC功能设置为
public
access,而不是
remote
,并意识到远程调用时它们仍在工作

正如您在下面看到的,我的
oncfcrest()
实现在我的整个应用程序中创建了一个巨大的安全漏洞,其中HTTP请求可用于调用任何HTTP可访问CFC上的任何
public
方法。

复制代码:

在Application.cfc中:

    public any function onCFCRequest(string cfc, string method, struct args){
        cfc = createObject('component', cfc);
        return evaluate('cfc.#method#(argumentCollection=args)');
    }
在远程调用的CFC中:

    public any function publicFunction(){
        return 'Public function called remotely!';
    }
问题:

我知道我可以在调用方法之前检查组件的元数据,以验证它是否允许远程访问,但是还有其他方法可以解决此问题吗?

onCfcRequest(),恐怕,您是通过盲目地运行该方法而创建了安全漏洞,而没有先检查是否适合这样做;-)

(注:我也犯了同样的错误,所以我不会尝试@you;-)

所以-是的-在运行该方法之前,您确实需要检查元数据。当您使用此处理程序时,该检查是CF传回给您以代替其进行管理的内容之一,并且已明确实现(请参阅)


我已经在我的电脑上写下了问题的描述和解决方案。正如在下面的评论中所观察到的,我在那里使用了一些代码-
invoke()
,这些代码只适用于CF10+,但一般的技术保持不变。

显然,这里的问题是我的实现。在每个远程请求的元数据上循环似乎会引入大量昂贵的开销。函数元数据保存在一个数组中(没有从结构键获取它的快捷方式),如果CFC扩展了另一个CFC,我必须继续沿着继承链向上,检查每个方法以找到(或不找到)正确的方法。当然,你只需要检查被调用的方法是否远程?我正忙着写博客(感谢灵感)。将很快用链接更新我的答案(+1小时,我想)。@imthepitts如果使用
GetComponentMetaData()
您将获得更少的开销(它是静态的)。或者,选择命名远程方法的约定,然后您可以快速检查方法名称。@AdamCameron,是的,我只需要检查方法是否远程,但这需要在函数元数据数组上循环,并检查名称和函数的访问。如果调用的函数来自super CFC,那么我必须获取它的函数元数据,并以同样的方式继续循环。最重要的是,元数据数组中有一个愚蠢的bug,它不允许(函数中的vari){}
样式的循环。你知道一种更简单的方法来获取这些信息吗?事实上,@Henry,你可能知道一些事情。我应该能够使用组件本身的命名约定,因为它们都包含“RemoteService”,并且只包含远程函数。所以,
如果不是“远程服务”,就不允许远程访问。
或其他什么。