11
votes

Refuser l'accès direct de l'URL à la méthode d'action

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.

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.

Ainsi, l'un d'entre vous de le faire pour le faire dans ASP.NET MVC3?


4 commentaires

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


5 Réponses :


4
votes

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


4 commentaires

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



0
votes

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.

à 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.

Question sur Stackoverflow


0 commentaires

1
votes

Il est impossible pour vous assurer de manière sécurisée qu'un utilisateur autorisé ne puisse pas utiliser une demande valide.
Après tout, si le navigateur peut créer une "demande valide", alors un utilisateur autorisé !

Cependant, il s'agit d'une exigence inhabituelle et je suis intéressé à savoir quelle est la motivation derrière elle?

Il y a cependant un certain nombre de façons de rendre plus difficile la répression de la requête.
Étant donné qu'aucune méthode ne sera complètement sécurisée, vous pouvez essayer de Obfuscate et le faire fastidieux pour que quelqu'un entrepre vos demandes.

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).

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 Click de link, ajoute la valeur "jeton" à l'URL, puis accédez à l'URL.

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.

Il existe des tonnes de solutions possibles, mais la solution "droite" dépend vraiment de quel comportement spécifique vous essayez de prévenir.


1 commentaires

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.



17
votes

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 xxx

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 xxx

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. .


1 commentaires

Superbe buddy! Merci beaucoup.



1
votes

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 = "" }));
            }
        }
    }


0 commentaires