2013-04-19 6 views
7

alcuni retroscena:funzioni pubbliche diventano accessibili in remoto in sede di attuazione onCFCRequest()

sto usando onCFCRequest() per gestire a distanza CFC chiama separatamente dai normali richieste di pagine CFM. Questo mi consente di rilevare errori e impostare i tipi MIME in modo pulito per tutte le richieste remote.

IL PROBLEMA:

ho impostato accidentalmente alcune delle mie funzioni CFC remoti di public l'accesso al posto di remote e si rese conto che stavano ancora lavorando quando viene chiamato da remoto.

Come potete vedere qui sotto, la mia implementazione di onCFCRequest() ha creato un grosso problema di sicurezza in tutta la mia applicazione, dove una richiesta HTTP potrebbe essere utilizzata per richiamare qualsiasi metodo public su qualsiasi CFC HTTP-accessibili.

REPRO CODICE:

In Application.cfc:

public any function onCFCRequest(string cfc, string method, struct args){ 
     cfc = createObject('component', cfc); 
     return evaluate('cfc.#method#(argumentCollection=args)'); 
    } 

In una CFC chiamata remoto:

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

DOMANDA:

So che potrei controllare i meta data per il componente prima di invocare il metodo per verificare che consenta l'accesso remoto, ma ci sono altri modi in cui potrei affrontare questo problema?

risposta

6

onCfcRequest() in realtà non creare il buco di sicurezza, si crea il buco di sicurezza eseguendo ciecamente il metodo senza controllare per vedere se è opportuno farlo prima, temo ;-)

(NB: mi sono innamorato della stessa identica cosa, quindi non sto provando tu stesso ;-)

Quindi - si - tu do devi controllare i metadati prima di eseguire il metodo. Tale controllo è una delle cose che CF ti restituisce per gestire al suo posto quando si utilizza questo gestore ed è stato esplicitamente implementato come tale (vedere 3039293).

Ho scritto una descrizione del problema e la soluzione sul mio blog. Come osservato in un commento qui sotto, utilizzo del codice - invoke() - che funzionerà solo su CF10 +, ma la tecnica generale rimane la stessa.

+0

Ovviamente è la mia implementazione che è il problema qui. Il looping dei metadati per ogni richiesta remota sembra che introdurrebbe un sacco di spese generali. I metadati delle funzioni sono contenuti in un array (nessuna scorciatoia per afferrarli da una chiave struct), e se il CFC sta estendendo un altro CFC, dovrò continuare la catena di ereditarietà, controllando ognuno dei metodi da trovare (o non trovare) quello giusto. Blech. – imthepitts

+0

Hai solo bisogno di verificare se il metodo chiamato è remoto o no, sicuramente? Sono nel bel mezzo del blogging su questo (grazie per l'ispirazione). Aggiornerò la mia risposta con il link a breve (+ 1 ora, immagino). –

+0

@imthepitts se usi 'GetComponentMetaData()' ottieni meno overhead (è statico).In alternativa, scegli una convenzione per denominare i metodi remoti, quindi puoi fare un rapido controllo nel nome del metodo. – Henry