Vérification de l'accès utilisateur pour les droits sur des objets de base de données ou des enregistrements particuliers

StackOverflow https://stackoverflow.com/questions/254610

Question

J'ai un débat amical avec un développeur sur une situation dans laquelle les utilisateurs se connectent et accèdent à des documents dans une application Web. Lorsque nous chargeons le document pour que l'utilisateur puisse l'afficher, nous avons l'ID utilisateur en session et le documentID pouvant être transmis via QueryString.

Pour empêcher l'utilisateur de modifier le documentID sur le QueryString, je propose que la procédure stockée qui charge le document prenne l'identifiant utilisateur en tant que paramètre permettant de valider les droits sur le document.

Mon ami développeur m'a suggéré de lancer une procédure distincte pour déterminer les droits d'accès au document plus haut dans la page, ainsi qu'une procédure permettant de récupérer le document lorsque le document doit être affiché.

Est-ce qu'il nous manque quelque chose? Lequel est le plus efficace et le plus sûr? Je pensais que passer l’ID utilisateur avec le DocID en une seule procédure pour vérifier les droits et extraire le document était une solution plus efficace.

Était-ce utile?

La solution

Du point de vue des performances, il serait préférable de transmettre l'ID utilisateur ainsi que l'ID DocumentID à une procédure stockée. Vous n'avez qu'un aller-retour vers le serveur de base de données. En outre, comme d'autres l'ont déjà fait remarquer, si vous récupérez ce document à partir d'autres pages ou applications, si vous utilisez la même procédure stockée, vous vous assurez que vous ne contournez pas la sécurité pour ce faire.

Cependant, il existe des scénarios où il est logique de disposer de procédures stockées de vérification de sécurité dédiées. Si vous souhaitez protéger d'autres ressources que des documents et que votre code de vérification n'est pas trivial, vous pouvez ne pas vouloir dupliquer le code de vérification dans chaque procédure stockée de votre base de données. Dans ce cas, il peut être judicieux de déplacer l'infrastructure de sécurité vers votre couche d'accès aux données et de laisser la couche d'accès aux données établir l'appel de base de données pour autoriser l'accès avant de récupérer la ressource demandée. Si vous choisissez cette voie, vous ne voulez pas que le développeur ait à toujours rappeler de faire un appel de base de données d'autorisation avant de demander une ressource.

Autres conseils

  

Je propose que la procédure stockée   qui charge le document prend la   UserId en tant que paramètre à valider   droits sur le document.

Je pense que c'est la voie à suivre. Si pour aucune autre raison que c'est plus sûr. Si vous réutilisez ce proc et oubliez de vérifier l'accès, vous avez ouvert un grand trou. Ainsi, il est évident que vous ne pouvez pas accéder à la doc sans y avoir accès.

L'identifiant doit être une variable de session. Droite. Passez le documentID dans la chaîne de requête. Yup.

En supposant que les documents soient stockés dans la base de données, j'aurais une table pour les autorisations: un ID d'enregistrement, un ID d'utilisateur et un ID de document. Vous faites une jointure avec cette table lorsque vous appelez le document. Si vous n'obtenez pas de résultat, vous n'obtenez pas le document. Indexez bien le tout et ce sera rapide.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top