2011-08-18 11 views
5

Sto utilizzando ColdFusion 9 e jQuery.ColdFusion CFC è molto sicuro quando l'accesso è remoto?

Sono una novità piuttosto nuova nell'utilizzo dei CFC ColdFusion tramite CFAJAXPROXY. Sono curioso di sapere se il mio database è a rischio e in che modo posso facilmente applicare patch alle falle di sicurezza.

ho messo questo in cima alla pagina:

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

Ecco un CFC che viene utilizzato dopo alcuni registri in:

<!--- 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> 

Ecco il jQuery che inviare i dati al CFC

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

Quindi, c'è un grosso buco di sicurezza qui? Dovrebbe essere usato l'accesso = "remoto" solo per il recupero dei dati?

+0

invece di due righe di cfscript, che dire di ''? :) – Henry

risposta

5

No, access = 'remote' non deve essere utilizzato solo per il recupero dei dati, ma deve essere utilizzato con attenzione e con una comprensione delle implicazioni sulla sicurezza.

Il modo in cui si dispone di questo set al momento, chiunque sarebbe in grado di effettuare una chiamata per inserire qualcosa nel DB (presumendo che non ci siano altri controlli di accesso che non stiamo vedendo). Quindi probabilmente dovresti implementare qualche tipo di controllo degli accessi per proteggere questa e altre funzioni.

Ora assumerò che tu non abbia messo la parola "facilmente" nella tua domanda e io invece inserirò la parola "praticamente". Quando si parla di sicurezza, raramente è "facile".

Quindi esistono diversi modi per proteggere questi metodi. Molto dipende da come lo vuoi fare e cosa stai facendo già.

  1. Se si utilizza <cflogin> si può essere in grado di aggiungere roles="<Your Admin role name>" alla funzione. Non ho mai provato questo, ma ho il sospetto che funzionerebbe. (Personalmente, non mi piace questo metodo per diversi motivi, ma è un'opzione)

  2. È possibile inserire una sorta di codice di autorizzazione nella parte superiore della funzione.

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

non mi piace questo metodo sia.

  1. Si potrebbe utilizzare la nuova modalità di onCFCRequest() App.cfc in ColdFusion 9 a intercettare le richieste e correre attraverso la vostra routine di autorizzazione. Questo è più pulito dell'opzione 2. Direi che questa è l'opzione più semplice e funzionerebbe in modo efficace, ma personalmente preferisco l'opzione 4.

  2. Il progetto ColdSpring ha alcuni ottimi strumenti per la creazione e il funzionamento automatico con oggetti proxy remoti che possono anche incorporare la sicurezza attraverso la programmazione orientata agli aspetti (AOP). La combinazione di proxy remoti e AOP è estremamente potente e consente di creare i metodi remoti senza esporre i veri oggetti sottostanti e di intercettare e autorizzare ogni richiesta a questi metodi senza dover ricorrere al codice stich in ogni metodo. In realtà, i metodi stessi non sono nemmeno consapevoli di essere protetti.

vorrei scegliere l'opzione 4. Può sembrare un processo scoraggiante ed estremamente di alto livello, e per certi versi lo è, ma in realtà è un bel po 'più facile di quanto si potrebbe pensare di implementare. I passaggi sono descritti nella Guida rapida di ColdSpring. http://www.coldspringframework.org/index.cfm/go/documentation

+1

È divertente. Ho appena realizzato che Stack Overflow si sta prendendo la libertà di rinumerare la mia lista. Nella schermata di modifica è 1,2,3,4 e in visualizzazione è 1,2,1,2. –

3

Bene ... tenere presente che se si dispone di un metodo che è accessibile in remoto ... chiunque può chiamarlo. Non solo il tuo codice AJAX. Il server CF non sa se le richieste provengono dal tuo proxy AJAX o se provengono da qualcun altro solo effettuando una chiamata remota.

E dato questo metodo inserisce DB, penso che ti stai lasciando un po 'aperto qui. Ma questo vale anche per le chiamate di tipo read ... è necessario tenere presente che - per impostazione predefinita - chiunque può effettuare la chiamata remota ed eseguire quella lettura.

Quello che devi veramente fare è mettere una sorta di autenticazione & di autorizzazione sul posto, quindi solo le richieste sanzionate possono effettuare le chiamate remote. Fai in modo che l'utente stabilisca una sessione in qualche modo (come l'accesso) e accetta solo richieste remote da sessioni autorizzate.

+0

Adam, questo è stato un buon consiglio quando l'hai offerto l'anno scorso. Ho ideato un ottimo sistema di sicurezza per proteggere i miei CFC. Ancora una volta, grazie! –

3

Se si sta verificando che qualcuno abbia effettuato l'accesso all'interno del file Application.cfc, questo va bene. Una richiesta AJAX è come qualsiasi altra richiesta e passerà prima attraverso Application.cfc.

È possibile verificarlo interrompendo onRequestStart() e verificando che non venga inserito nulla. Probabilmente fallirà silenziosamente e non sarà la soluzione più elegante ma funzionerà.

3

Ecco un modo in cui è possibile proteggere i CFC accessibili a distanza dall'essere chiamati da applicazioni "non autorizzate".

Utilizzare verifyClient() o l'attributo cffunction verifyClient="true"

Il metodo verifyClient() e verifyClient attributo assicurano che la richiesta di chiamata ha incluso un token di protezione crittografato che Coldfusion generato per la vostra applicazione. Tale token di sicurezza viene implicitamente inviato insieme ai dati quando si effettua una chiamata al proprio CFC utilizzando <cfajaxproxy>. Se quel token non fosse incluso nella richiesta, Coldfusion genererà un'eccezione.

<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 non supporta il metodo verifyClient(). Dovrai imitare il comportamento da solo se lo desideri.

+1

Questo metodo è ottimo se si sa che si utilizzerà sempre cfajaxproxy di altri strumenti CF Ajax. Ma penso che diventerà rapidamente un PITA se si desidera effettuare chiamate remote ajax da una chiamata non CF (come una semplice chiamata jQuery $ .ajax()). –

+0

@Jason - sì assolutamente.Se l'OP desiderava solo generare chiamate dalla sua app, allora avrebbe senso, altrimenti usare verifyClient() non sarebbe l'approccio migliore. – jalpino

+0

Alla fine ho implementato il tuo comportamento verifyClient(). Grazie per l'ottima idea. –