Web services 如何保护ColdFusion CFC Web服务?

Web services 如何保护ColdFusion CFC Web服务?,web-services,coldfusion,security,cfc,Web Services,Coldfusion,Security,Cfc,我正在为希望能够检索购物车信息并在购物车中添加/更新项目的客户创建一个简单的Web服务。我编写了一个CFC,每个CFC都有一个远程方法。现在,显然,当这些CFC方法设置为access=“remote”时,整个世界都可以按原样调用它们。但是,我需要启用安全性,以确保唯一可以远程调用这些方法(而不是从我的网站中)的人是我已授予权限的人。我也不想让它具有侵扰性(强制登录等) 例如,Web服务存在于上,我只希望允许来自和的请求。使用HTTP\u refere是不好的,因为这可能会被欺骗。我该怎么做?是否

我正在为希望能够检索购物车信息并在购物车中添加/更新项目的客户创建一个简单的Web服务。我编写了一个CFC,每个CFC都有一个远程方法。现在,显然,当这些CFC方法设置为
access=“remote”
时,整个世界都可以按原样调用它们。但是,我需要启用安全性,以确保唯一可以远程调用这些方法(而不是从我的网站中)的人是我已授予权限的人。我也不想让它具有侵扰性(强制登录等)

例如,Web服务存在于上,我只希望允许来自和的请求。使用
HTTP\u refere
是不好的,因为这可能会被欺骗。我该怎么做?是否可以使用自签名证书以某种方式验证请求是否被允许


注意:我还希望能够将这些Web服务用于我们自己网站的呼叫,因此我需要一个适用于这两种情况的解决方案。

我实际上面临着同样的问题。我正在考虑向我的web服务的消费者颁发一个密钥,并获取他们的IP地址。然后,在web服务调用中,他们需要在头部分发送密钥。然后,我将根据密钥和远程地址验证请求。我相信有更好的方法可以做到这一点,我也会对其他人提供的服务感兴趣。

我认为最好的办法是在客户端网站上设置代理web服务。在任何情况下,您都很可能需要这样做,因为否则这些站点的用户将受到跨域访问限制的影响(ajax请求通常只允许返回最初请求页面的域)

例如,这里有一个Web服务:

在每个客户端站点上都会有另一个Web服务,类似于:

<cfcomponent>
<cffunction name="getData" access="remote" returnType="struct">
    <cfargument name="myArg1"><!--- whatever is needed for your service --->
    <cfset var ret = {}>
    <cfset var secretKey = "MySuperSecretSharedKey">
    <cfif IsDefined("session.validUser")><!--- whatever is needed to validate remote user --->

    <cfinvoke 
      webservice="https://www.mywebsite.com/myService.cfc?wsdl" 
      method="getData" 
      returnVariable="ret"> 

       <cfinvokeargument name="secretKey" value="#secretKey#">
       <cfinvokeargument name="myArg1" value="#arguments.myArg1#"><!--- etc.... --->

    </cfinvoke>

    </cfif>
    <cfreturn ret>
</cffunction>
</cfcomponent>

myServiceProxy.cfc的外观如下:

<cfcomponent>
<cffunction name="getData" access="remote" returnType="struct">
    <cfargument name="myArg1"><!--- whatever is needed for your service --->
    <cfset var ret = {}>
    <cfset var secretKey = "MySuperSecretSharedKey">
    <cfif IsDefined("session.validUser")><!--- whatever is needed to validate remote user --->

    <cfinvoke 
      webservice="https://www.mywebsite.com/myService.cfc?wsdl" 
      method="getData" 
      returnVariable="ret"> 

       <cfinvokeargument name="secretKey" value="#secretKey#">
       <cfinvokeargument name="myArg1" value="#arguments.myArg1#"><!--- etc.... --->

    </cfinvoke>

    </cfif>
    <cfreturn ret>
</cffunction>
</cfcomponent>


从本例中可以看到,代理代码将能够基于会话或其他任何必要的内容检查用户是否有效。然后,因为这个代理代码已经配置了一个密钥,可以传递回您的实际服务。使用该密钥,您可以验证服务的调用者是否有效(还要记下HTTPS,这绝对是个好主意)。应该是这样

您可以在cfc的同一文件夹中的Application.cfc中添加额外的登录逻辑。如果愿意,可以通过HTTPS使用HTTP基本身份验证。使用
获取用户名和密码。


<cfhttp method="get" url="http://api.bitly.com/v3/shorten?login=xxxxxxxxxx&apiKey=xxxxxxxxxxxxx&longUrl=http://www.xxxxxxxxxxxxx.com&format=xml" result="returnObject">
bitly需要的变量包括:

  • 登录名(登录名)
  • apiKey(秘密密钥)
  • longurl(要缩短的url)
  • 格式(返回格式)

因为他们是向世界开放的,所以必须有用户名和密钥。同样如此。

当您说“来自您的站点1和站点2的请求”时,您的意思是运行这些站点的服务器将调用web服务,还是这些站点的访问者?供应商网站上的访问者将发起对我们web服务的调用。例如,当他们单击“将项目添加到购物车”时,它将调用一个Web服务,该服务将项目/数量组合发送到Web服务,Web服务将该用户的值存储在数据库中。