2009-05-22 9 views
6

L'une des principales caractéristiques des CFC est la possibilité de réutiliser le code à la fois pour une page .cfm droite et pour les applications Flex. Une telle application que j'ai dévlopée utilise Flex pour ses capacités de cartographie et a besoin d'accéder à une fonction 'getResults()' dans le cfc.Comment protéger accès = fonctions "à distance" dans les CFC de snoopers?

Tout ce contenu est derrière un mécanisme d'authentification, mais puisque le cfc va s'ouvrir à une demande de wsdl:

https://myserver.com/c/functions.cfc?wsdl

et retourneront les résultats au navigateur si la requête URL est conçu correctement:

https://myserver.com/c/functions.cfc?method=getResults&Term=2009&Course=Anatomy

Quelles sont les techniques utilisées pour protéger le cfc contre un accès direct SAUF si la requête provient directement du processeur CFML OU de Flex Remoting?

Répondre

4

Vous pouvez utiliser certaines variables d'étendue CGI pour vérifier d'où provient la requête.

-à-dire: CGI.REMOTE_HOST, CGI.REMOTE_ADDR

Donc, vous auriez probablement construire une nouvelle fonction avec un accès = propriété « publique » qui vérifie les valeurs de ces variables à une liste de valeurs valides pour votre serveur. Si elle renvoie true, vous exécuterez la requête et si elle renvoie false, vous lancerez/retournerez une sorte d'erreur.

+0

Vous pourriez également probablement sécuriser la demande avec une sorte d'informations d'identification pour ajouter un autre mince mur d'ennui. –

+0

Je pense que c'est la voie à suivre. J'utilise CGI.SCRIPT_NAME pour tester si le navigateur accède directement au CFC. S'ils le sont, ils obtiennent le démarrage. –

3

Je suggère d'ajouter un gestionnaire OnRequestStart à votre fichier application.cfc et effectuer une vérification là ... ce que l'enregistrement est dépend de votre modèle actuel, mais quelques bonnes suggestions serait de vérifier cgi .remote_user (si authentifié) ou peut-être stocker quelque chose dans la portée de la session?

<cfif structKeyExists(session,"empID") and len(session.empid)> 
    <!--- user is authenticated, process normally ---> 
<cfelse> 
    <!--- abort request or sending meaningful error message ---> 
</cfif> 
+0

Je suppose que j'essaie aussi de protéger le cfc spécifique d'être manipulé par quelqu'un qui est déjà authentifié/autorisé –

1

Une chose que je préfère faire est d'avoir un seul argument pour chaque méthode - XML ​​ou Struct - et nécessitent un certain noeud/nom d'objet à présent dans ce XML ou Struct.

<cfif NOT StructKeyExists(arguments.myArgs, "requiredParam")> 
    <cfxml name="myXML"> 
     <error> 
      <message>Required parameter not found.</message> 
     </error> 
    </cfxml> 

    <cfreturn myXML /> 
</cfif> 

2

Qu'en est-il en utilisant les nouveaux rôles d'attributs? Tout le monde qui visite votre site obtient automatiquement cflogin roles = "public".

0

Juste suis tombé sur cette question tout à la recherche d'autre chose et pensé que j'ajouter mon 2p:

J'ai une application à l'aide d'un CFC à distance que je veux seulement être disponible pour les utilisateurs connectés « admin ». Dans ce cas, la vérification des variables CGI est toujours transmise aux utilisateurs invités de l'application.Lorsqu'un utilisateur administrateur se connecte, je saisis son ID de session et son heure de connexion et les stocke dans la base de données et dans la portée de la session. Quand je frappe le CFC distant, je passe le hash en tant que variable et le vérifie par rapport à la base de données des utilisateurs admin.

Si un enregistrement revient, je sais que l'utilisateur actuel est admin et je continue avec la demande.