2010-10-20 9 views
31

Snoop vous permet de regarder à l'intérieur de l'application et de modifier les propriétés des éléments. C'est un excellent atout pour les développeurs, mais cela peut être un problème de sécurité dans certains cas, comme lorsque nous avons des utilisateurs qui aiment regarder dans des endroits où ils ne devraient pas regarder. Y at-il un moyen de faire quelque chose pour bloquer des applications comme Snoop de "fouiner" votre application?Comment protéger votre application wpf?

Et s'il n'y a aucun moyen de le bloquer, que recommandez-vous pour minimiser les risques de sécurité? Snoop est un utilitaire qui vous permet de parcourir l'arborescence visuelle d'une application wpf et d'afficher et de modifier les propriétés. C'est très utile lorsque vous essayez de déboguer quelque chose et que vous n'avez aucune idée de ce qui se passe. Vous pouvez trouver plus here.

Merci.

+0

Bonne question, été Je me demande moi-même –

+1

Pouvez-vous donner plus d'informations sur ce programme "Snoop", ou afficher un lien vers des informations à ce sujet? –

Répondre

30

En implémentant correctement la sécurité. Si votre "sécurité" peut être contrecarrée avec un outil comme Snoop, alors vous le faites mal. Supposons qu'il existe une commande que seuls certains utilisateurs peuvent exécuter. Il semble que le seul endroit où vous appliquez ceci est au niveau de l'interface utilisateur (en désactivant le bouton correspondant, par exemple). Cela étant le cas, vous avez raison - je pourrais facilement utiliser Snoop pour activer le bouton et exécuter la commande. Mais vous devez appliquer les contraintes de sécurité sur votre serveur, ou peut-être dans la logique d'exécution de votre commande si vous n'avez pas de serveur. Fondamentalement, la sécurité devrait être mise en œuvre aussi près que possible de la chose que vous essayez de protéger. La sécurité au niveau de l'interface utilisateur est simplement pour la commodité de l'utilisateur.

+0

Kent, merci pour votre réponse. Je suis d'accord avec vous, la sécurité ne devrait pas être mise en œuvre au niveau de l'interface utilisateur. Sur mon projet, nous utilisons des commandes et nous avons une logique dans CanExecute qui va désactiver les boutons pour certains utilisateurs (et ils ne peuvent pas être réactivés avec snoop), ainsi que des sauvegardes serveur qui empêchent les utilisateurs de faire certaines choses. Cependant, nous avons d'autres applications qui n'utilisent pas les commandes et les boutons sont juste cachés, donc ils peuvent être facilement "snoopé". – chiefanov

39

Il existe en fait un moyen de détecter si votre application est "snoopée" par le programme snoop. La solution que je vais donner n'est pas une solution miracle, et si quelqu'un veut vraiment espionner votre application, il devra modifier le code source de snoop (c'est un projet open source). Ce que snoop fait, c'est injecter un assemblage dans votre application, et l'assemblage injecté examine récursivement l'arborescence visuelle de votre application en commençant à la racine. En d'autres termes, snoop exécute réellement à l'intérieur de votre application. Cela dit, la solution consiste à déclencher un événement lorsque l'ensemble Snoop est injecté dans votre application.

D'abord, vous devez vous abonner à l'événement chargé assemblage quelque part dans votre application (de préférence le begginging):

AppDomain.CurrentDomain.AssemblyLoad += new AssemblyLoadEventHandler(CurrentDomain_AssemblyLoad); 

Ensuite, vous mettre en œuvre le gestionnaire un peu comme ceci:

 void CurrentDomain_AssemblyLoad(object sender, AssemblyLoadEventArgs args) 
    { 
     if (args.LoadedAssembly.FullName.StartsWith("ManagedInjector")) 
      MessageBox.Show("hey you, stop snooping");//and shut down your application. 
    } 

Vous auriez probablement besoin d'améliorer cette solution pour une vraie solution balle d'argent, mais au moins cette solution arrêtera définitivement la dernière version de Snoop en cours d'exécution telle quelle (sans le code modifié). La meilleure solution serait de vérifier qu'aucun assemblage externe n'est injecté dans votre application. Cependant, Kent a toujours raison dans le fait qu'un utilitaire comme Snoop ne devrait pas causer de failles de sécurité puisque la sécurité ne devrait pas être implémentée au niveau de l'interface utilisateur. Mais au moins cela vous montre comment empêcher les gens de "fouiner" votre application.

+3

C'est génial. Et en combinaison avec la réponse de Kent exactement ce que je cherchais. – chiefanov

+2

Les deux sont de bonnes réponses, merci beaucoup les gars –

+0

oui, cette réponse complète la solution. – ahmedsafan86

0

réponses Great pour une très bonne question,

Je veux ajouter un exemple du mot de passe qui ne devrait jamais être enregistré dans votre datacontext, comme chèque de Snoop aussi le DataContext de l'interface utilisateur, donc si vous utilisez le droit contrôle PasswordBox vous trouverez que vous ne pouvez pas lier la propriété de mot de passe, cela signifie que même si vous snoop l'application, vous ne pouvez pas obtenir le mot de passe car il n'est enregistré dans aucune propriété

Mais nous avons trouvé beaucoup de gens qui essayent de créer un travail autour (aides, comportements, usercontrol ...) pour lier le mot de passe, mais ils oublient que snoop peut l'obtenir comme ça

Donc, votre serveur ne devrait jamais faire confiance à votre client, chaque fois qu'il devrait vérifier le bon privilège (comme nous pouvons sniffer la requête client en utilisant Fiddler pour exp puis reconstruire une requête custome pour passer la sécurité de l'application cliente)