2010-06-08 14 views
2

Considérons une application ASP.NET MVC utilisant le paramètre Salt dans la directive.chargement à l'exécution de ValidateAntiForgeryToken Valeur salt

Le scénario est tel que l'application sera utilisée par de nombreux clients. Il n'est pas vraiment souhaitable d'avoir le Salt connu au moment de la compilation.

La stratégie actuelle consiste à localiser la valeur Salt dans le fichier web.config.

[ValidateAntiForgeryToken(Salt = Config.AppSalt)] 
//Config.AppSalt is a static property that reads the web.config. 

Cela conduit à une exception à la compilation ce qui suggère que le Salt doit être const au moment de la compilation.

un argument d'attribut doit être une expression constante, typeof expression ou une matrice expression création d'un paramètre d'attribut de type

Comment modifier l'application pour permettre un chargement d'exécution du Salt de sorte que le l'application n'a pas besoin d'être re-salée et recompilée pour chaque client?

penser que les Salt ne changera pas souvent, le cas échéant, supprimant ainsi la possibilité de vicier forme

+0

Comme Levi les gars de sécurité Microsoft MVC états, vous n'avez pas besoin de le faire. – RickAndMSFT

Répondre

5

J'avais l'exigence d'avoir différents sels pour différents clients. Dans ce cas, j'ai utilisé la solution de Dixin pour injecter le sel à l'exécution.

Anti Forgery Request Recipes For ASP.NET MVC and AJAX à la section intitulée "Spécifier sel non constant dans l'exécution".

Décorez vos contrôleurs avec un nouvel attribut:

[ValidateAntiForgeryTokenWrapper(HttpVerbs.Post)] 
public class ProductController : Controller 
{  
    // Only HTTP POST requests are validated. 
} 

Ce nouvel attribut est défini comme:

public class ValidateAntiForgeryTokenWrapperAttribute : FilterAttribute, IAuthorizationFilter 
{ 
    public ValidateAntiForgeryTokenWrapperAttribute(HttpVerbs verbs) 
    { 
     this._verbs = new AcceptVerbsAttribute(verbs); 
     this._validator = new ValidateAntiForgeryTokenAttribute() 
      { 
       //load from web.config or anywhere else 
       Salt = Configurations.AntiForgeryTokenSalt 
      }; 
    } 

    // Other members. 
} 
+0

très gentil poste :) – Thomas

6

La propriété sel est censé être une constante de compilation. C'est simplement un moyen de lier un formulaire particulier à une méthode d'action particulière. Par exemple, si vous avez un formulaire de connexion, vous pouvez utiliser le salt "Login" pour ce formulaire afin qu'un jeton valide pour le formulaire de connexion ne puisse pas être utilisé pour le formulaire de changement de mot de passe, etc

Dans tous les cas, la touche machine de l'application est automatiquement utilisée comme valeur de sel supplémentaire. Ainsi, un jeton anti-XSRF pour une application ne peut pas être utilisé pour une autre application, même si les deux valeurs salt indiquent "Login". La clé machine est configurable dans la section Web.config <machineKey>.

+0

Si j'ai un formulaire de connexion, je n'ai pas besoin de protection anti-contrefaçon, n'est-ce pas? Parce que l'utilisateur n'est pas encore authentifié et qu'il n'y a encore rien à protéger. – UserControl

+1

Si vous ne protégez pas le formulaire de connexion, vous êtes potentiellement ouvert à l'ouverture de session CSRF. Voir http://en.wikipedia.org/wiki/CSRF#Forging_login_requests pour plus d'informations. (Edit: la propriété 'Salt' a été retirée de MVC 4 car la plupart des applications n'en ont pas besoin.Voir docs pour plus d'informations si vous l'utilisiez.) – Levi

+0

Merci, intéressant. Mais selon l'article, il est possible que dans le contexte de Flash (crossdomain.xml), les sites réguliers ne sont pas affectés? – UserControl