2010-11-29 9 views
3

Je passe une variable à un fichier SWF qui donne accès à plusieurs autres fichiers SWF. Vous pouvez voir la ligne que j'utilise pour attribuer la valeur à la variable sous le commentaire THIS LINE ci-dessous.S'agit-il d'une vulnérabilité d'application Web?

<script type="text/javascript"> 
       /*THIS LINE*/ 
       var flashvars = {a: "<%= User.Identity.IsAuthenticated %>"}; 
       /* 
        Some other stuff here... 
       */ 
     swfobject.embedSWF("index.swf", "myAlternativeContent", "100%", "100%", "10.0", "expressInstall.swf", flashvars, params, attributes); 
    </script> 

Je crains que quelqu'un en utilisant un proxy HTTP pourrait simplement changer la valeur de a de faux à vrai si elles voulaient avoir accès. Ai-je raison d'être inquiet?

Existe-t-il une façon différente de contrôler si l'accès au fichier SWF enfant est autorisé? Je dirais n'émettant rien qu'ils n'ont pas accès à

+0

Vous devriez demander cela sur http://security.stackexchange.com/ – AviD

Répondre

4

Dans ce cas, s'ils ne sont pas authentifiés, n'envoyez aucun de ces scripts au navigateur.

Oui, vous devriez être concerné. En supposant que vous ne pouvez pas changer le flux (ie: vous devez envoyer le script même s'il n'est pas authentifié), alors je changerais la valeur "true/false" en un type de clé. Les enfants doivent vérifier que la clé a été transmise avant l'exécution.

Si possible, rendez l'utilisateur clé spécifique.

Cela ne résout pas complètement le problème, mais il serait plus difficile pour quelqu'un de fournir une clé qu'ils n'ont pas.

MISE À JOUR:
Sur la base des très bons commentaires, j'ai un itinéraire différent. Ajoutez un gestionnaire de requêtes Web (fichier .ashx) sur le site.

Demandez au client de l'appeler pour charger le fichier swf. Le gestionnaire devrait d'abord tester pour voir si elles sont bien connectées. Si c'est le cas, servez le fichier. Si ce n'est pas juste de fermer la connexion.

changer Fondamentalement, la ligne embed pour ressembler à quelque chose comme:

swfobject.embedSWF("grabFile.ashx?id=123", "myAlternativeContent", "100%", "100%", "10.0", "expressInstall.swf", flashvars, params, attributes); 

Puis ont un gestionnaire de requêtes .ashx sur votre site de test pour être connecté avant response.writing le contenu réel du fichier swf.

+0

pourrait-ils pas décompiler la SWF et déterminer quelle clé ils doivent fournir? –

+1

votre premier point est discutable. Si l'utilisateur obtient un extrait de script de sa page lorsqu'il est connecté, il peut simplement annuler son compte, puis revenir sur le site et coller le même extrait sur sa page (en utilisant Firebug) pour obtenir un accès gratuit/non autorisé. – orokusaki

+0

@Abe - oui. Vous pouvez décompiler ActionScript en ligne gratuitement dans 30 secondes environ. C'est la sécurité à travers l'obscurité. – orokusaki

1

Oui, ils pourraient. La sécurité ne fonctionne pas du côté du client, vous devez contrôler l'accès aux fichiers du serveur.

0

yup, il s'agit d'une vulnérabilité et vous n'avez pas besoin d'utiliser un proxy pour l'exploiter. Vous devriez refuser l'accès au serveur si vos utilisateurs ne sont pas authentifiés.

+0

Eh bien, je veux que 90% de l'application soit accessible aux utilisateurs non authentifiés. Quel serait le meilleur moyen pour moi d'empêcher l'accès au fichier SWF protégé? Devrais-je simplement le déposer dans son propre répertoire, puis utiliser l'authentification .NET? –

+0

Je ne connais pas beaucoup les spécificités de .NET. Testez si l'utilisateur est authentifié, servez le fichier s'il le sont. –

0

Oui. Si l'utilisateur a Firebug, il peut simplement regarder à quoi ressemble le code de l'appliation lorsqu'il est connecté, puis le modifier pour le mettre en miroir lorsqu'il n'est pas connecté. Vous devez gérer l'authentification par requête, et côté serveur . Si vous essayez:

If User logged in: 
    Put Flash in page 
Else: 
    Put angry message 

L'utilisateur peut toujours copier l'extrait de Flash quand ils sont connectés, et le coller quand ils ne sont pas connectés, avec Firebug, etc.

Cependant, si vous utiliser:

Put Flash in page 
Listen for requests from the Flash app to the server (for database content): 
    If the User who requests content is logged in: 
     Return content 
    Else: 
     Return angry message 

Cela fonctionnera.Si l'application entière est basée sur Flash (c'est-à-dire qu'elle n'a pas besoin d'accès à la base de données), la seule façon de la sécuriser sera de protéger les dossiers au niveau du serveur (voir Amember, et al). Même si vous faites en sorte que l'application Flash s'appuie sur un dongle avec le serveur à des fins d'authentification, l'utilisateur peut simplement télécharger vos scripts Flash, les décompiler et les distribuer gratuitement. Ils peuvent toujours le faire avec la protection de dossier, mais au moins les utilisateurs libres n'auront pas cet accès. Votre meilleur pari est de faire dépendre l'application du contenu provenant de votre serveur.

+0

Intéressant, j'ai peu d'expérience dans l'utilisation de Flash avec ASP.NET. Comment ferais-je quelque chose du côté serveur quand quelque chose se passe dans Flash? Y a-t-il une sorte d'événement que je peux déclencher? –

+0

@Abe - Je ne suis pas un expert Flash, mais vous pouvez essentiellement faire l'équivalent d'AJAX (je retournerais JSON de votre serveur pour tout le contenu). Flux: 1) L'utilisateur se connecte via un formulaire de connexion Flash, 2) Le serveur répond avec une clé de session unique, 3) L'application Flash définit le cookie dans le navigateur avec la clé de session, 4) L'application Flash demande du contenu JSON au serveur. com/flash_content/'), en passant la clé de session comme preuve d'identité, 5) Votre application .Net vérifie l'identité, et renvoie le contenu du serveur (base de données ou non), 6) Votre application Flash affiche le contenu. – orokusaki

1

Oui, ce qui maintient un attaquant d'écrire une page html statique qui fait cela:

var flashvars = {a: "AUTHENTICATED"};