2008-10-29 8 views
5

Comment vous assurer correctement qu'un utilisateur ne falsifie pas les valeurs de la chaîne de requête ou les valeurs de l'URL d'action? Par exemple, vous pourriez avoir une action Delete Comment sur votre CommentController qui prend un CommentID. L'action url pourrait ressembler à/Comments/Delete/3 pour supprimer le commentaire avec l'id 3.Sécurité avec des valeurs QueryString dans Asp.net MVC

Maintenant, évidemment, vous ne voulez pas que quelqu'un soit en mesure de supprimer le commentaire 3. Normalement sur le propriétaire du commentaire ou un administrateur a permission de le faire. J'ai vu cette sécurité appliquée de différentes manières et j'aimerais savoir comment certains d'entre vous le font.

Effectuez-vous plusieurs appels à la base de données pour récupérer le commentaire et vérifier que l'auteur du commentaire correspond à l'utilisateur qui appelle l'action de suppression?

Passez-vous à la place le CommentID et l'ID utilisateur à la procédure stockée qui effectue la suppression et effectuez une suppression où ID utilisateur et CommentaireID égalent les valeurs transmises?

Est-il préférable de chiffrer les valeurs de chaîne de requête?

Répondre

18

Ce n'est pas le cas.

Il est une règle cardinale de la programmation, en particulier en ce jour et l'âge, que vous ne faites jamais confiance toute entrée qui vient de l'utilisateur, le navigateur, le client, etc.

Il est aussi un cardinal règle de programmation que vous ne devriez probablement pas essayer d'implémenter le cryptage et la sécurité vous-même, sauf si vous savez vraiment ce que vous faites. Et même si vous savez ce que vous faites, vous ne garderez qu'une longueur d'avance sur les retardataires. Les intelligents vont encore se moquer de vous.

Effectuez la requête supplémentaire pour vous assurer que l'utilisateur connecté possède le bon ensemble d'autorisations. Cela rendra la vie de tout le monde beaucoup plus simple.

0

J'ai fait des choses géniales prennent la querystring, compresser, base64 ou tout simplement hex encode, de sorte que "CommentID = 4 & userid = 12345" devient "code = 1a2b23de12769"

Il est essentiellement « La sécurité par obscurité "mais cela fait beaucoup de travail pour quelqu'un qui essaie de pirater le site.

0

Vous ne pouvez pas facilement faire cela. J'ai de bons souvenirs d'un site qui utilisait des URL d'action pour faire des suppressions.

Tout allait bien jusqu'à ce qu'ils commencent à explorer l'intranet.

Ooops, données d'au revoir.

Je recommanderais une solution par laquelle vous n'utilisez pas de chaîne de requête pour tout ce que vous ne souhaitez pas modifier.

+0

Alors, comment proposez-vous que je modifier/supprimer des choses puis? Gardez à l'esprit que j'utilise Asp.net MVC – Vyrotek

+0

Vous devriez POSTing à vos méthodes de contrôleur pour invoquer une suppression - et vérifier les informations d'identification de la requête (cookie/nom d'utilisateur/mot de passe/quoi que ce soit) avant d'effectuer la suppression. Voir le post de @ Schotime. –

1

Vous pouvez également autoriser uniquement les demandes de post à supprimer l'action du contrôleur à l'aide de l'attribut Accept Verbs comme indiqué ci-dessous.

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Delete(int? id) 
{ 
    //Delete 
} 

Ensuite, vous pouvez également utiliser le jeton comme discuté ici anti-contrefaçon:

http://blog.codeville.net/2008/09/01/prevent-cross-site-request-forgery-csrf-using-aspnet-mvcs-antiforgerytoken-helper/

+1

Dans MVC 2.0, vous pouvez également invoquer Http delete. Placez simplement [HttpDelete] au lieu de [HttpPost] sur votre action, puis soumettez le formulaire en utilisant le protocole delete au lieu de post. – Josh

3

Vyrotek: La méthode d'entrée est importante. GET, POST, GET chiffré/obfusqué - pas de réelle différence.Peu importe la façon dont votre application reçoit des commandes, pour effectuer une action administrative, elle doit s'assurer que l'utilisateur émetteur est autorisé à faire ce qu'il veut. La vérification d'autorisation doit avoir lieu APRES la réception de la commande et avant qu'elle ne soit exécutée. Sinon, ce n'est pas du tout la sécurité.

6

Enrypting et le déchiffrement params de requête est un processus trivial et il y a quelques grands exemples de la façon de le faire en utilisant un HttpModule ici sur StackOverflow.

« Vous n'avez pas », « Vous ne pouvez pas » ou « Il est difficile » sont tout simplement pas des réponses acceptables à ce jour et l'âge ...

Questions connexes