在《 Adobe ColdFusion 10开发指南》中的Using WebSocket in point-to-point communication中,由mysocket
创建的javascript对象<cfwebsocket>
可以调用invoke()
方法,该方法可以从JavaScript实际调用Any CFC上的Any公共方法。
这不是安全风险吗? cfc /功能应如何防止websocket调用?
1.创建一个CFM页面index.cfm。
<script type="text/javascript">
function msgHandler(msgobj){
var txt = document.getElementById("myDiv");
var message = ColdFusion.JSON.encode(msgobj);
txt.innerHTML += message + "<br >" + "<br>";
}
function invokecfcfn(){
var fname= document.getElementById("fnname").value;
if (fname == "f2") {
alert("f2 selected");
mysocket.invoke("mycfc", "f2", ["echo"]);
}
else
mysocket.invoke("mycfc", fname);
}
</script>
<cfwebsocket name="mysocket" onmessage="msgHandler"/>
<form>
<select id="fnname">
<option>f1</option>
<option>f2</option>
<option>f3</option>
</select>
<input id="invokefn" name="invokefn" value="Invoke CFC function " type="button" onclick="invokecfcfn();">
<div id="myDiv">
</div>
</form>
2.创建一个CFC mycfc.cfc,其中包含从客户端页面调用的函数。
<cfcomponent>
<cffunction name="f1" >
<cfreturn "Message returned from f1">
</cffunction>
<cffunction name="f2" returntype="string" >
<cfargument name="arg1" type="string" required="true" >
<cfset msg= "Message from wsssendmessage of f2 which you called with arg " & arg1>
<cfset wssendMessage(msg)>
<cfreturn "Message returned from f2">
</cffunction>
<cffunction name="f3" >
<cfthread action="run" name="t1" >
<cfloop index="i" from="1" to="10">
<cfset sleep(20000)>
<cfset wssendMessage("Message #i# from wsssendmessage of f3 #now()#")>
</cfloop>
</cfthread>
<cfreturn "Thread initiated in f3">
</cffunction>
</cfcomponent>
编辑:不是任何函数,私有函数返回:
{
"clientid":39550088,
"ns":"coldfusion.websocket.channels",
"reqType":"invoke",
"code":4001,
"type":"response",
"msg":"The method f1 was not found in component mycfc.cfc."
}
更新:
我尝试将
mycfc.cfc
移到/com
(在webroot之外),并向/com
添加了映射,但函数仍可以成功调用。更新:2013年7月3日
Adobe产品安全事件响应团队(PSIRT)知道
此问题,并与ColdFusion产品团队积极合作以
发布修复程序。
http://blogs.coldfusion.com/post.cfm/coldfusion-10-websocket-vulnerebility
更新:2013年7月9日
Adobe已发布Windows版ColdFusion 10的安全修补程序,
Macintosh和Linux。此修补程序解决了一个漏洞
(CVE-2013-3350)可能允许攻击者调用公共方法
使用WebSocket在ColdFusion组件(CFC)上运行。
http://www.adobe.com/support/security/bulletins/apsb13-19.html
最佳答案
我认为您无法使用ColdFusion修复此问题(更新:此版本是在ColdFusion 10.0.11发布之前编写的;此问题现在已由10.0.11解决)。我不认为Bruce基于CFML的答案-尽管可以使用它或它的变体形式-在现实世界中确实可行。
我可能会回过头来使用防火墙规则:Web套接字请求来自特定端口,因此您可以针对该端口上的请求制定一套规则,以及允许使用哪些方法。
这不是一个很好的解决方案,但考虑到这种情况,它可能是最方便的选择。
我在对您的原始问题的评论中指出了我在CF方面的研究,但最好从这里链接到它:“ Web socket security issue: risk assessment & findings”
关于coldfusion - CF10 websocket p2p可以从JavaScript调用任何CFC中的任何公共(public)功能。这不是安全风险吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17351214/