Je crée une application Web structurée API et dans cette application, nous avons différentes couches qui font leur propre travail.
La première couche est la couche de validation qui valide les entrées de l'utilisateur et si elle passe la validation, nous la déplaçons vers la deuxième couche (qui est la couche de contrôle d'accès ) sinon, retournons le message d'erreur
La deuxième couche est le contrôle d'accès qui vérifie si l'utilisateur est autorisé à effectuer la tâche qu'il souhaite effectuer.Si l'utilisateur a la permission, il déplace la demande vers la couche suivante, sinon renvoie un message d'erreur
La troisième couche est la couche contrôleur où nous avons la logique d'application
Ma question est la suivante: est-ce correct d'avoir une couche de validation avant le contrôle d'accès? Que se passe-t-il si l'utilisateur essaie d'effectuer une tâche à laquelle l'utilisateur n'a pas l'autorisation et que nous renvoyons un message d'erreur de validation? L'utilisateur enverrait des demandes à un point de terminaison et parlerait avec la couche de validation et une fois la validation réussie, il verrait le messageYou can't access this!
Cela me semble étrange, est-ce que c'est bien comme ça ou quelles pourraient être mes autres options dans l'infrastructure?
la source
Réponses:
Cela dépend si la connaissance de la validité d'une entrée pour une tâche que vous n'êtes pas autorisé à faire est une fuite de sécurité. Si c'est le cas, vous devriez vraiment le faire dans l'autre sens.
La seule réponse sûre à un utilisateur non autorisé est "accès refusé". Si parfois la réponse est «mauvaise demande» et parfois «accès refusé», vous envoyez des informations à un utilisateur non autorisé.
Par exemple, vous pouvez vérifier la validation de la tâche "supprimer le document" que le document nommé existe. Quelqu'un sans autorisation serait en mesure de discerner si quelque chose existe en tentant de le supprimer et en comparant l'erreur qu'il reçoit en retour. Un attaquant particulièrement déterminé pourrait énumérer tous les noms de documents (sous une certaine longueur), pour voir lesquels existent.
la source
Eh bien, il existe plusieurs types de validation:
Vérification de la santé de base bon marché, qui vérifie que la demande n'est pas manifestement malformée.
Ceci est généralement au moins partiellement dupliqué côté client, pour éviter les allers-retours inutiles.
Quoi qu'il en soit, cela devrait être fait avant le contrôle d'accès pour rendre les choses plus faciles et moins sujettes aux erreurs, car cela ne risque pas de fuite d'informations.
Validation plus coûteuse qui ne dépend toujours d'aucune donnée d'application protégée.
S'il y a une telle validation supplémentaire, cela peut être après le contrôle d'accès non pas pour éviter les fuites de données, mais pour empêcher les attaques DOS.
Parfois, la simple exécution de la demande effectue une partie de cette validation implicitement à un coût réduit ou nul, elle peut donc être omise ici.
Si toute la validation de la première étape est dupliquée, il peut également être judicieux de dupliquer des parties de ce côté client.
Validation supplémentaire en fonction des données d'application protégées.
Le faire avant le contrôle d'accès risque évidemment de provoquer des fuites d'informations. Ainsi, faites d'abord le contrôle d'accès.
la source
Il doit y avoir une validation avant le contrôle d'accès. Supposons que l'API de SO ait un point de terminaison "modifier la réponse", alors si l'utilisateur peut modifier une réponse particulière peut dépendre de la réponse (en dessous d'une certaine réputation, un utilisateur ne peut modifier que ses propres réponses). Le paramètre "ID de réponse" bien formé doit donc être vérifié avant que la couche de contrôle d'accès n'entre en jeu; peut-être aussi que la réponse existe.
OTOH, comme le mentionnent Caleth et Greg, mettre une validation plus approfondie avant le contrôle d'accès est un risque potentiel pour la sécurité.
Les règles strictes sont donc
Le respect de ces deux règles peut signifier que vous devez avoir une validation avant et après le contrôle d'accès.
la source
En plus de la frustration possible de recevoir un «accès refusé» après avoir validé la saisie; gardez également à l'esprit que la couche Validation , à moins qu'elle ne soit très simple, peut toujours avoir besoin des informations du contrôleur . En gardant cela à l'esprit, je pense que positionner la validation derrière le contrôle d'accès , plus près du contrôleur est plus logique.
la source
Cela dépend de ce que vous entendez par couche de validation - si vous entendez simplement par là vérifier la syntaxe de la demande, c'est sûr et quelque chose que vous devez faire de toute façon. Si votre «validation» utilise des informations auxquelles un utilisateur non privilégié n'a pas accès, ce n'est plus sûr.
Vous devriez certainement avoir un vérificateur d'esprit avant d'essayer de contrôler l'accès, mais vous devez vous assurer de communiquer très clairement à tous les responsables (actuels et futurs) que cette partie ne doit pas utiliser d'informations privilégiées; Ces vérifications doivent être effectuées dans une étape de validation distincte après l' authentification.
En tant que contrôle d'intégrité pour le vérificateur d'intégrité, il ne devrait en fait pas avoir de dépendances de code sur une partie de votre code plus bas dans le pipeline et devrait être séparable dans son propre package qui devrait être publiquement publiable sans aucun problème (autre que les éventuels problèmes juridiques) . Si vous ne pouvez pas faire cela, votre «couche de validation» en fait trop (ou votre base de code est un gâchis).
la source
Non, ce n'est pas ok.
Si vous avez un bogue dans votre couche de validation, il peut contourner la couche de sécurité.
C'est une erreur courante de considérer la sécurité comme faisant partie des exigences commerciales. "seuls les utilisateurs ayant le rôle ventes, devraient pouvoir voir les chiffres trimestriels" semble être une règle commerciale.
Mais si vous voulez être sécurisé, vous devez lire une telle règle comme "seuls les utilisateurs dans le rôle de vente, devraient pouvoir exécuter du code sur ce point de terminaison" Vous devez vous assurer que votre serveur retourne toujours "accès refusé" avant d'arriver à tout type de code que vous avez écrit ou fichiers sur le serveur.
la source