2011-08-18 25 views
5

Estoy usando ColdFusion 9 y jQuery.¿Los ColdFusion CFC son muy seguros cuando el acceso es remoto?

Soy nuevo en el uso de CFC ColdFusion a través de CFAJAXPROXY. Tengo curiosidad acerca de si mi base de datos está en riesgo y cómo podría parchar fácilmente los agujeros de seguridad.

Pongo esto en la parte superior de la página:

<cfajaxproxy cfc="brands" jsclassname="jsApp"> 

Aquí es un CFC que se utiliza después de unos troncos en:

<!--- ADD BRAND ---> 
<cffunction name="addBrand" access="remote"> 
    <cfargument name="SiteID" required="true"> 
    <cfargument name="Brand" required="true"> 
    <cfscript> 
     LOCAL.SiteID = ARGUMENTS.SiteID; 
     LOCAL.Brand = trim(left(ARGUMENTS.Brand, 50)); 
    </cfscript> 
    <cfquery name="GetBrands"> 
     INSERT INTO Brands(SiteID, Brand) 
     VALUES  (<cfqueryparam cfsqltype="cf_sql_integer" value="#LOCAL.SiteID#">, 
        <cfqueryparam cfsqltype="cf_sql_varchar" value="#LOCAL.Brand#">) 
    </cfquery> 
    <cfreturn true> 
</cffunction> 

Aquí está la jQuery que publicar los datos a la CFC

$("#AddBrand").click(function() { 
    NewBrand = $("#NewBrand").attr("value"); 
    var jro = new jsApp(); 
    jro.addBrand(NewBrand); 
}); 

Entonces, ¿hay un gran agujero de seguridad aquí? ¿Debería access = "remote" usarse solo para recuperar datos?

+0

en lugar de dos líneas de cfscript, ¿qué tal ''? :) – Henry

Respuesta

5

No, access = 'remote' no necesita ser usado solo para recuperar datos, pero necesita ser usado cuidadosamente y con una comprensión de las implicaciones de seguridad.

De la forma en que lo tiene establecido ahora, cualquiera podría hacer una llamada para insertar algo en su base de datos (suponiendo que no haya otros controles de acceso que no veamos). Entonces, probablemente debería implementar algún tipo de control de acceso para proteger esta y otras funciones.

Ahora voy a suponer que no puso la palabra "fácilmente" en su pregunta y en su lugar voy a poner la palabra "prácticamente". Cuando se trata de seguridad, rara vez es "fácil".

De modo que hay varias formas de proteger estos métodos. Mucho depende de cómo quiera hacerlo y de lo que esté haciendo.

  1. Si está utilizando <cflogin> es posible que pueda añadir roles="<Your Admin role name>" a la función. Nunca lo intenté, pero sospecho que funcionaría. (Personalmente, este método no me gusta por varias razones, pero es una opción)

  2. Puede poner algún tipo de código de autorización en la parte superior de la función.

<cfif NOT mySecurityCFC.isAuthorized(COOKIE.CFID,COOKIE.CFTOKEN)><cfreturn /></cfif>

no me gusta este método tampoco.

  1. Se podría utilizar el nuevo método de onCFCRequest() App.cfc en ColdFusion 9 para interceptar las peticiones y ejecutar a través de su rutina de autorización. Esto es más limpio que la opción 2. Yo diría que esta es la opción más fácil y funcionaría de manera efectiva, pero a mí personalmente me gusta más la opción 4.

  2. El proyecto ColdSpring tiene algunas herramientas excelentes para crear y trabajar automáticamente con objetos proxy remotos que también pueden incorporar seguridad a través de la Programación Orientada a Aspectos (AOP). La combinación de proxies remotos y AOP es extremadamente poderosa y puede permitirle crear métodos remotos sin exponer los objetos subyacentes reales e interceptar y autorizar cada solicitud a esos métodos sin tener que codificar en todos los métodos. De hecho, los métodos mismos ni siquiera son conscientes de que están siendo asegurados.

yo elegiría la opción 4. Puede sonar como un proceso desalentador y muy alto nivel, y en cierto modo lo es, pero en realidad es mucho más fácil de lo que piensa implementar. Los pasos se describen en la guía de inicio rápido de ColdSpring. http://www.coldspringframework.org/index.cfm/go/documentation

+1

Eso es gracioso. Me acabo de dar cuenta de que Stack Overflow se está tomando la libertad de volver a numerar mi lista. En la pantalla de edición es 1,2,3,4 y en pantalla es 1,2,1,2. –

3

Bueno ... tenga en cuenta que si tiene un método que es accesible de forma remota ... cualquiera puede llamarlo. No solo su código AJAX. El servidor de CF no sabe si las solicitudes provienen de su proxy AJAX o si provienen de alguien más que hace una llamada remota.

Y dado que este método tiene inserciones DB, creo que te estás dejando un poco abierto aquí. Pero esto se aplica incluso con las llamadas de tipo de lectura ... debe tener en cuenta que, de forma predeterminada, cualquier persona puede realizar la llamada remota y realizar esa lectura.

Lo que realmente tiene que hacer es poner en su lugar algún tipo de autorización de autenticación &, por lo que solo las solicitudes sancionadas pueden realizar llamadas remotas. Haga que el usuario establezca una sesión de alguna manera (como iniciar sesión) y solo acepte solicitudes remotas de sesiones autorizadas.

+0

Adam, este fue un buen consejo cuando lo ofreciste el año pasado. Inventé un gran plan de seguridad para proteger mis CFC. ¡Gracias otra véz! –

3

Si está comprobando que alguien ha iniciado sesión en su archivo Application.cfc, está bien. Una solicitud AJAX es como cualquier otra solicitud y pasará primero por Application.cfc.

Puede probar esto cancelando onRequestStart() y viendo que no se inserta nada. Probablemente fallará en silencio y no será la solución más elegante, pero funcionará.

3

Aquí hay una manera de ayudar a proteger sus CFC a los que se accede de forma remota contra llamadas de aplicaciones 'no autorizadas'.

Uso verifyClient() o el atributo cffunction verifyClient="true"

El método verifyClient() y verifyClient atributo aseguran que la solicitud de llamada ha incluido una señal de seguridad encriptada, que ColdFusion genera para su aplicación. Ese token de seguridad se envía implícitamente junto con sus datos cuando realiza una llamada a su CFC usando <cfajaxproxy>. Si ese token no se incluyó en la solicitud, Coldfusion emitirá una excepción.

<cffunction name="myMethod" access="remote"> 

    <!--- Prevent requests that have not originated from this application ---> 
    <cfset verifyClient() > 

    ... 

</cffunction> 

<!-- Or ---> 

<cffunction name="myMethod" access="remote" verifyClient="true"> 

    ... 

<cffunction> 

** Railo 3.2.x no es compatible con el método verifyClient(). Tendrá que imitar el comportamiento usted mismo si lo desea.

+1

Este método es excelente si sabes que siempre usarás cfajaxproxy de otras herramientas CF Ajax. Pero creo que se convertirá rápidamente en un PITA si desea realizar llamadas ajax remotas desde una llamada no generada por CF (como una llamada jQuery $ .ajax() simple). –

+0

@Jason - sí absolutamente.Si el OP solo quería llamadas para generar de su aplicación, entonces tiene sentido, de lo contrario, usar verifyClient() no sería el mejor enfoque. – jalpino

+0

Eventualmente implementé tu comportamiento verifyClient(). Gracias por la gran idea. –

Cuestiones relacionadas