2013-04-19 4 views
7

Zum Hintergrund: CFC ruft getrennt von regulären CFM Seite Anfragenöffentliche Funktionen werden remote zugegriffen werden, wenn die Umsetzung onCFCRequest()

ich onCFCRequest() bin mit Fernbedienung zu handhaben. Dadurch kann ich Fehler erkennen und MIME-Typen für alle Remote-Anforderungen sauber festlegen.

DAS PROBLEM:

ich einige meiner Remote-CFC-Funktionen public Zugriff statt remote und erkannte zufällig eingestellt, dass sie arbeiteten noch, wenn remote aufgerufen.

Wie Sie unten sehen können, meine Implementierung von onCFCRequest() hat eine klaffende Sicherheitslücke in meine gesamte Anwendung erstellt, wo eine HTTP-Anforderung verwendet werden könnte jede public Methode auf jedem HTTP-zugänglichen CFC aufzurufen.

REPRO CODE:

In Application.cfc:

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

In einem CFC entfernt aufgerufen:

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

Frage:

Ich weiß, dass ich die Metadaten für die Komponente überprüfen konnte, bevor ich die Methode zur Überprüfung des Remote-Zugriffs aufrief, aber gibt es andere Möglichkeiten, wie ich dieses Problem angehen könnte?

Antwort

6

onCfcRequest() nicht wirklich die Sicherheitslücke erstellen, Sie die Sicherheitslücke, ohne zu überprüfen, indem blind laufen die Methode erstellen zu sehen, ob es so zuerst angemessen ist zu tun, ich habe Angst ;-)

(NB: Ich habe genau das gleiche Problem, also habe ich kein @ Sie ;-)

Also - yeah - Sie tun müssen die Metadaten vor dem Ausführen der Methode überprüfen. Dieser Check ist einer der Punkte, die CF an Sie zurückgibt, wenn Sie diesen Handler verwenden, und wurde explizit als solcher implementiert (siehe 3039293).

Ich habe eine Beschreibung des Problems und die Lösung auf meinem blog geschrieben. Wie ich in einem Kommentar unten gesehen habe, benutze ich dort einen Code - invoke() - der nur auf CF10 + funktioniert, aber die allgemeine Technik bleibt gleich.

+0

Offensichtlich ist es meine Implementierung, die das Problem hier ist. Das Durchschleifen der Metadaten für jede Remote-Anfrage scheint eine Menge teuren Overhead zu verursachen. Funktionsmetadaten werden in einem Array gespeichert (keine Verknüpfung zum Abrufen von einem Strukturschlüssel), und wenn der CFC einen anderen CFC erweitert, muss ich die Vererbungskette weiterführen und jede der zu suchenden Methoden (oder nicht finden) der richtige. Blech. – imthepitts

+0

Sie müssen nur überprüfen, ob die aufgerufene Methode entfernt ist oder nicht, sicher? Ich bin gerade dabei, darüber zu bloggen (danke für die Inspiration). Werde meine Antwort kurz mit dem Link aktualisieren (+ 1h, stelle ich mir vor). –

+0

@imthepitts Wenn Sie 'GetComponentMetaData()' verwenden, erhalten Sie weniger Overhead (es ist statisch).Oder wählen Sie alternativ eine Konvention zum Benennen der Remote-Methoden, dann können Sie den Methodennamen schnell einchecken. – Henry

Verwandte Themen