web-dev-qa-db-fra.com

Est-ce une bonne pratique de montrer une erreur d'accès non autorisé 403 à l'utilisateur?

Chaque fois que nous voyons une page d'erreur d'accès interdit 403, nous pensons arriver à un endroit où des données secrètes ou privées sont présentes. À ce stade, les méchants savent que cela pourrait être intéressant et commencent à voir s'ils peuvent faire quelque chose pour accéder à ces données secrètes.

Est-il donc bon d'afficher cette erreur ou simplement de rediriger vers un autre endroit?

Modifier

Je pense que traiter l'erreur est de rediriger vers une page de connexion distincte pour accéder à ce recours particulier. Mais dans ce cas, que se passe-t-il si je ne veux tout simplement pas que quiconque (peut-être même l'administrateur) ait accès à ces ressources via mon application. L'administrateur hors ligne peut accéder à la même ressource par un autre moyen au niveau du backend.

28
ThankYouSRT

Dans un environnement de production, vous souhaitez généralement divulguer le moins d'informations possible. Pour cela, il est préférable d'afficher les codes d'erreur génériques:

  • Erreur 4 pour les erreurs liées au client: mauvaise demande, authentification requise, etc.
  • Erreur 5 pour les erreurs liées au serveur: base de données en panne, site en panne pour maintenance, etc.

Idéalement, vous ne devriez pas opter pour les pages d'erreur par défaut fournies par votre serveur Web. Soit vous créez vos propres pages d'erreur , soit vous modifiez les pages d'erreur par défaut de manière à masquer toute information pouvant être utilisée par un attaquant. Par exemple, voici une erreur de l'un de nos serveurs lors de l'accès à une URL protégée par mot de passe:

enter image description here

Au-delà de cela, il s'agit d'un pur problème d'utilisation et il dépend fortement de la casse. Ne devriez-vous pas rediriger les utilisateurs vers la page d'accueil? Ces zones sont-elles protégées par mot de passe? Devriez-vous consulter un formulaire de connexion? Ou voulez-vous simplement afficher le message d'erreur générique avec le style de votre site?

Voici un exemple de page d'erreur sur notre site (Security.StackExchange)

enter image description here

10
Adi

Comme le dit @Adnan, dans tout environnement de production, vous souhaitez limiter les fuites d'informations. Une redirection peut également être utile pour un attaquant.

Je prendrais la recommandation un peu plus loin et dirais que vous ne devriez pas seulement limiter les types d'erreurs, mais que vous ne devriez également fournir des pages d'erreur personnalisées qu'à l'utilisateur final.

Les pages par défaut de 400 ou 500 pages contiennent souvent une multitude d'informations sur l'erreur, ce qui est très utile pour un attaquant - il peut découvrir quel logiciel est en cours d'exécution, quel serveur Web, quel système d'exploitation, etc.

Ainsi, la recommandation générale dans un contexte d'erreur est de fournir une page personnalisée à l'utilisateur qui reconnaît une erreur mais ne révèle rien, par exemple:

enter image description here

En interne, toutes les erreurs doivent être enregistrées, afin qu'elles puissent être traitées.

9
Rory Alsop

Oui, cela signifie simplement que l'authentification a réussi, mais le compte n'est pas autorisé à afficher cette ressource. Par RFC2616 , un HTTP 404 pourrait être utilisé à la place. Cependant, je déconseille que le retour d'un 403 offre les avantages suivants:

  1. Pour les systèmes avec plusieurs comptes (c'est-à-dire Active Directory), cela fournit les informations nécessaires à l'utilisateur qui peut-être qu'il s'est connecté avec le mauvais compte et doit essayer un autre.
  2. Si l'utilisateur a légitimement besoin d'un accès, le ticket d'assistance peut être rapidement traité en sachant qu'il obtient un 403.

Dans votre scénario, les "méchants" se sont déjà connectés avec succès. Espérons que le processus d'autorisation soit suffisamment robuste pour déjouer d'autres dommages (c'est-à-dire ne pas utiliser de chaînes de requête).

Bien que beaucoup aient commenté la désactivation des messages d'erreur détaillés, je conviens que c'est une meilleure pratique. Cependant, un 403 est très différent d'une erreur de serveur telle qu'un HTTP 500 où des informations intéressantes sont imprimées à l'écran. Encore une fois, un 403 signifie simplement que vous n'êtes pas autorisé à afficher une ressource particulière après une connexion réussie. Continuez donc à renvoyer un 403 mais n'incluez pas d'informations de diagnostic détaillées.

S'il s'agit d'une ressource extrêmement sensible, envisagez de la séparer et d'exiger une authentification à deux facteurs. Cela fournira une sécurité supplémentaire que la personne est vraiment ce qu'elle prétend être lorsqu'elle accède à la ressource protégée.

6
user2320464

Pour répondre à votre première question, il est pas bon d'afficher cette erreur à l'utilisateur final.

Afficher une page d'erreur par défaut qui contient les détails techniques exacts est pas une bonne pratique. Il a des problèmes de sécurité et d'expérience utilisateur.

Si l'utilisateur est une personne non technique, ce type de messages d'erreur peut le gêner fortement avec tout le contenu technique qu'il contient. Il ne saura pas quoi faire pour résoudre l'erreur qu'il ne comprenait pas.

D'un autre côté, si l'utilisateur est un technicien (disons un mauvais), il a une chance pour lui d'avoir un aperçu ou une idée globale de votre structure de sécurité de votre application. Il y a une bonne chance d'être exposé s'il découvre les modèles de sécurité dans votre application parce que les attaques qu'il essaie de casser votre application seront précis ou au moins un peu plus spécifiques =.

Pour répondre à votre seconde question, la redirection vers une autre page ne semble pas être une bonne idée conviviale.

Lorsque l'utilisateur essaie d'accéder à quelque chose et qu'il le redirige directement vers la page d'accueil ou toute autre page, cela gâcher la convivialité et les utilisateurs s'intéressent à votre application. Si vous voulez vraiment le rediriger quelque part, montrez-lui un net message personnalisé puis redirigez-le. Pour qu'il sache au moins ce qui se passe.

Gestion des erreurs est la solution à votre problème. Pensez toujours du point de vue de l'utilisateur lorsque vous préparez les messages d'erreur. Show personnalise les messages d'erreur que l'utilisateur peut facilement comprendre et n'expose pas non plus la structure de sécurité de votre application.

Conclusion - Tout type d'erreurs doit être géré et personnalisé avant d'informer l'utilisateur.

4
Ebenezar John Paul

Est-ce une bonne pratique? Ça dépend. Je suis d'accord que vous ne voulez probablement pas simplement envoyer la page par défaut à l'utilisateur. Cela gâche la convivialité et peut fournir trop d'informations à un attaquant s'il existe des détails techniques.

Mais qu'en est-il de l'envoi de 403 erreurs plus généralement? Ici, je suis moins convaincu que c'est une mauvaise idée en général, et la plus grande question est de savoir ce qui se passe ou pourquoi l'erreur 403 se produit-elle?

Si je vois une erreur 403 avec une page d'erreur par défaut, ou en particulier lorsque je ne suis même pas connecté, cela crie "administrateur incompétent" et peut donc sembler inviter une attaque non pas tant à travers ce qu'il révèle sur votre site autant que ce qu'il révèle sur vos administrateurs.

Mais supposons que je suis connecté. J'ai été authentifié. Y a-t-il une raison lorsque j'essaie d'accéder à une ressource que je ne suis pas autorisé à voir si elle doit renvoyer autre chose qu'un message d'erreur 403 Accès refusé? La transmission du code d'erreur permet de gérer cela par programme côté client, ce qui est une considération importante pour des choses comme les services Web.

Évidemment, cela ne devrait jamais se produire lorsque vous essayez de faire quelque chose exposé dans l'interface utilisateur. Mais en tant que couche supplémentaire de défense et d'opportunité pour la gestion des erreurs, je ne vois rien de mal à renvoyer le code d'erreur dans ce cas, car il peut y avoir des causes (encore une fois, les services Web me viennent à l'esprit) où la transmission du code d'erreur est la meilleure voie à suivre.

Donc, avec cela à l'esprit, je vois quelques éléments qui doivent être examinés de manière non préjudiciable:

Quelles sont les informations divulguées qui peuvent aider un attaquant? Quelles informations doivent être fournies avec le message d'erreur?

En général, avec LedgerSMB, nous nous connectons de manière approfondie, mais tout ce qui est interdit d'accès est un message très court du côté client. Cela permet à l'administrateur de voir ce qui se passe mais pas à l'utilisateur.

Qu'est-ce que le client doit au minimum savoir pour gérer l'erreur?

Habituellement, OMI, juste que l'accès a été refusé malgré la connexion. Le 403 peut être utile ici, mais vous ne voulez pas envoyer beaucoup plus que cela.

Quelles autres préoccupations avez-vous?

Beaucoup de choses dépendent du modèle de menace. Le modèle de menace d'une application Web orientée client est très différent d'une application Web métier et différent d'un service Web par abonnement. Vous devez savoir ce que vous protégez et de quoi avant d'aller plus loin.

2
Chris Travers

En regardant le contexte de votre question, il semble que ce soit une page d'administration qui nécessite une connexion pour y accéder. Vous craignez qu'en affichant une erreur 403 aux utilisateurs non autorisés, cela permette à quiconque devine l'URL de savoir que la page est là, mais qu'elle n'est pas accessible.

De toute évidence, la page d'erreur, le cas échéant, ne doit pas divulguer d'informations telles que l'architecture et la version de votre serveur. Je ne vais pas répéter ces choses très fondamentales à nouveau. Il y a quelques options ici. Examinons les différentes options:

Une redirection vers la page de connexion administrateur:

Ceci est utile du point de vue de l'administrateur. Un délai d'expiration de session s'est peut-être produit. L'administrateur qui a cliqué sur le lien vers cette page serait redirigé directement vers la page de connexion pour continuer l'accès privilégié. Quant aux autres, ils seraient également redirigés vers la page de connexion. S'il s'agit d'une connexion cachée, cela reviendrait à montrer la porte à un pirate. Dans ce cas, je déconseille fortement la redirection.

Afficher l'erreur 403:

Cette erreur est sans ambiguïté. L'administrateur et l'utilisateur pourraient comprendre que leur accès est refusé car ils ne sont pas autorisés. Pour l'administrateur, cela peut être dû à un délai d'expiration de session, ou lorsqu'ils accèdent à la page à partir d'une adresse IP non reconnue. Maintenant, un pirate déterminé peut également, par hasard et par erreur sur cette page. La question est, devriez-vous vous en inquiéter? Si la page elle-même n'accepte aucune entrée d'utilisateur et que vous êtes sûr que le code est propre et bien écrit, vous ne devriez pas l'être.

Afficher l'erreur 404:

En affichant une erreur 404, vous effectuez en fait un la sécurité par l'obscurité . Il y a sans aucun doute un gain de sécurité mais vous ne devez pas vous y fier uniquement. Un utilisateur devrait normalement passer à autre chose en voyant une erreur de fichier 404 introuvable. Il y a un compromis ici car votre administrateur peut être confus lorsqu'un code d'erreur différent de celui attendu est affiché. Si votre administrateur le sait, cela ne devrait pas poser de problème.

Vous posez cette question parce que vous êtes inquiet. Pour avoir la tranquillité d'esprit, je choisirais la troisième option. Mais en fin de compte, c'est à vous de décider en fonction des exigences de sécurité de votre application Web.

2
Question Overflow