J'essaie de trouver un moyen de refuser tout accès direct à mes méthodes d'action. Fondamentalement, ce que je veux que mes utilisateurs cliquent sur des liens pour naviguer au lieu de taper l'URL directement dans la barre d'adresse de leurs navigateurs. P>
Maintenant, je sais que cela peut être fait en vérifiant l'URLREFERRER de l'objet de la demande, mais cela est un peu fiable et faible, car l'Urlreferrer peut facilement être modifié et que certaines des suites de sécurité enlèvent réellement de la demande. P>
Ainsi, l'un d'entre vous de le faire pour le faire dans ASP.NET MVC3? P>
5 Réponses :
Je ne suis pas sûr, mais peut-être que cela peut vous aider Considérez que nous avons une page avec cette URL
www.yoursite.com/fdmf489ruv30/home.aspx
C'est une bonne idée. Mais ce ne serait-il pas aussi efficace si l'identifiant unique était une chaîne de requête?
Je ne veux vraiment pas faire cela parce que cela rendrait les URLS désordonnées et non sympathiques.
Oui, c'est une mauvaise idée du référencement (essayez d'obtenir un meilleur rang dans Google par d'autres concepts de référencement). et à propos de la chaîne de requête, je n'ai pas testé si ma soi-même et me dire le résultat
Le référencement est vraiment non-problème si vous empêchez l'accès de toute façon, car les crawlers ne peuvent pas y arriver de toute façon. Cependant, pour la propreté, j'éviterais aussi cette approche
Un moyen rapide de faire est de définir une session contenant un nombre aléatoire dans l'action qui se redirige, transmet également le nombre aléatoire sous forme de paramètre à l'autre action. P>
à l'intérieur de l'autre action (redirigé une), comparez la valeur de la session avec le paramètre de l'action. Si les valeurs sont égales égales, l'utilisateur y obtient en appuyant sur le bouton, sinon, l'utilisateur s'y rend en modifiant l'URL. J'espère que ça vous aide. P>
Il est impossible em> pour vous assurer de manière sécurisée qu'un utilisateur autorisé ne puisse pas utiliser une demande valide. Cependant, il s'agit d'une exigence inhabituelle et je suis intéressé à savoir quelle est la motivation derrière elle? P>
Il y a cependant un certain nombre de façons de rendre plus difficile la répression de la requête. Comme d'autres l'ont suggéré, vous pouvez créer un "jeton" aléatoire par session et l'exiger de l'URL (soit en tant que chemin ou en tant que querystring). p>
Il serait encore préférable d'utiliser JavaScript pour cela. Rendez une entrée cachée avec ce «jeton». Ensuite, intercepter chaque événement Vous pouvez améliorer le JavaScript pour «traiter» votre jeton avant de l'utiliser et miniez votre JavaScript pour l'obscier ... Cela dissuaderait certainement les utilisateurs ci-dessus de Tinkering avec vos URL. p>
Il existe des tonnes de solutions possibles, mais la solution "droite" dépend vraiment de quel comportement spécifique vous essayez de prévenir. P>
Après tout,
Étant donné qu'aucune méthode ne sera complètement sécurisée, vous pouvez essayer de Obfuscate fort> et le faire fastidieux strong> pour que quelqu'un entrepre vos demandes. p>
Click CODE> de link, ajoute la valeur "jeton" à l'URL, puis accédez à l'URL. p>
D'accord avec cela. Qu'est-ce que vous essayez d'accomplir? Vous pouvez créer un conteneur de page HTML global et utiliser des actions basées sur AJAX renvoyant HTML que vous avez imbécile. Les actions AJAX peuvent limiter l'accès direct de l'URL via des attributs ou d'autres moyens de jeton cachés.
ci-dessous est le code de la méthode NodirecTAccessAttribute pour limiter l'accès direct à une méthode de classe ou d'action qui applique l'attribut indireccaccess Utilisez le filtre d'action comme suit pour tout contrôleur ou méthode d'action où Vous ne voulez pas que l'utilisateur la demande directement p> dans l'exemple ci-dessus, tout accès direct à la méthode d'action Isusternameunique redirigera automatiquement l'utilisateur à la méthode d'action Accueil / Index. . p> p>
Superbe buddy! Merci beaucoup.
Utilisez ce code dans global.asax.cs et appelez [nodirecttaccess] à tous les contrôleurs
//Prevent direct URL access: Call [NoDirectAccess] to all controllers to block [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)] public class NoDirectAccessAttribute : ActionFilterAttribute { public override void OnActionExecuting(ActionExecutingContext filterContext) { if (filterContext.HttpContext.Request.UrlReferrer == null || filterContext.HttpContext.Request.Url.Host != filterContext.HttpContext.Request.UrlReferrer.Host) { filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new { controller = "Home", action = "Login", area = "" })); } } }
Comment "sécurisé" a-t-il besoin d'être? Voulez-vous simplement empêcher les utilisateurs de pouvoir être en faveur de signet et / ou de type URL? Ou voulez-vous vraiment le faire en sécurité contre les personnes qui savent vraiment comment servir JavaScript et cookies?
Je veux que cela soit aussi sécurisé que possible, c'est pourquoi l'Urlreferrer ne convient pas vraiment car il peut être spoofé assez facilement
Est-ce pour prévenir le CSRF? Ou avez-vous vraiment besoin d'empêcher même les utilisateurs "autorisés" d'utiliser des demandes valides de spoofing?
Ce n'est pas à propos de la CSRF, nous utilisons l'attribut validaeantoForgeryToken pour cela. Nous voulons empêcher tous les utilisateurs (y compris les "autorisés") d'accéder directement aux méthodes d'action! La seule URL accessible sera le domaine / la connexion