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?
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
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). –
@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