Une chaîne de requête HTTPS est-elle sécurisée?

351

Je crée une API Web sécurisée qui utilise HTTPS; cependant, si j'autorise les utilisateurs à le configurer (y compris l'envoi du mot de passe) à l'aide d'une chaîne de requête, cela sera-t-il également sécurisé ou devrais-je le forcer à le faire via un POST?

John
la source

Réponses:

453

Oui, ça l'est. Mais utiliser GET pour des données sensibles est une mauvaise idée pour plusieurs raisons:

  • Surtout une fuite de référence HTTP (une image externe dans la page cible peut révéler le mot de passe [1])
  • Le mot de passe sera stocké dans les journaux du serveur (ce qui est évidemment mauvais)
  • Caches d'historique dans les navigateurs

Par conséquent, même si Querystring est sécurisé, il n'est pas recommandé de transférer des données sensibles sur Querystring.

[1] Bien que je doive noter que RFC indique que le navigateur ne doit pas envoyer de référents de HTTPS à HTTP. Mais cela ne signifie pas qu'une mauvaise barre d'outils de navigateur tiers ou une image / flash externe d'un site HTTPS ne la fuira pas.

dr. mal
la source
4
Qu'en est-il des référents https vers https ? Si j'obtiens une image d'un site tiers en utilisant https? Le navigateur enverra-t-il l'intégralité de la chaîne de requête de ma demande précédente au serveur tiers?
Jus12
4
@ Jus12 oui ça va, ça n'a pas de sens mais c'est comme ça que c'est conçu.
dr. evil
2
Alors pourquoi la spécification OAuth2 n'est-elle pas recommandée pour envoyer des données sensibles dans les paramètres de requête (dans l'URL)? Même s'il est recommandé d'utiliser toujours TLS (HTTPS). Reportez-vous au dernier point dans tools.ietf.org/html/draft-ietf-oauth-v2-bearer-16#section-4.3 CC @volka
gihanchanuka
@ dr.evil Pourriez-vous s'il vous plaît expliquer quel est le problème History caches in browsersou ajouter une référence pour ir?
LCJ
1
Pour compléter cette réponse avec des informations à jour: securitynewspaper.com/2016/08/01/… (Le hack Proxy PAC permet l'interception des URL HTTPS)
Tom
78

Du point de vue de "renifler le paquet réseau", une demande GET est sûre, car le navigateur établira d'abord la connexion sécurisée puis enverra la demande contenant les paramètres GET. Mais les URL GET seront stockées dans l'historique du navigateur de l'utilisateur / saisie semi-automatique, ce qui n'est pas un bon endroit pour stocker, par exemple, les données de mot de passe. Bien sûr, cela ne s'applique que si vous prenez la définition plus large de "Webservice" qui pourrait accéder au service à partir d'un navigateur, si vous n'y accédez qu'à partir de votre application personnalisée, cela ne devrait pas poser de problème.

Il est donc préférable d'utiliser post au moins pour les boîtes de dialogue de mot de passe. De plus, comme indiqué dans le lien que littlegeek a publié, une URL GET est plus susceptible d'être écrite dans les journaux de votre serveur.

VolkA
la source
48

Oui , vos chaînes de requête seront cryptées.

La raison en est que les chaînes de requête font partie du protocole HTTP qui est un protocole de couche application, tandis que la partie sécurité (SSL / TLS) provient de la couche transport. La connexion SSL est d'abord établie, puis les paramètres de requête (qui appartiennent au protocole HTTP) sont envoyés au serveur.

Lors de l'établissement d'une connexion SSL, votre client effectuera les étapes suivantes dans l'ordre. Supposons que vous essayez de vous connecter à un site nommé example.com et que vous souhaitez envoyer vos informations d'identification à l'aide des paramètres de requête. Votre URL complète peut ressembler à ceci:

https://example.com/login?username=alice&password=12345)
  1. Votre client (par exemple, navigateur / application mobile) résoudra d'abord votre nom de domaine example.comen adresse IP à l' (124.21.12.31)aide d'une demande DNS. Lors de l'interrogation de ces informations, seules les informations spécifiques au domaine sont utilisées, c'est-à-dire que seules example.comseront utilisées.
  2. Maintenant, votre client essaiera de se connecter au serveur avec l'adresse IP 124.21.12.31et tentera de se connecter au port 443 (le port de service SSL n'est pas le port HTTP 80 par défaut).
  3. Maintenant, le serveur example.comenverra ses certificats à votre client.
  4. Votre client vérifiera les certificats et commencera à échanger une clé secrète partagée pour votre session.
  5. Une fois la connexion sécurisée établie, ce n'est qu'alors que vos paramètres de requête seront envoyés via la connexion sécurisée.

Par conséquent, vous n'exposerez pas de données sensibles. Cependant, l'envoi de vos informations d'identification via une session HTTPS à l'aide de cette méthode n'est pas le meilleur moyen. Vous devriez opter pour une approche différente.

Ruchira Randana
la source
2
Mais voyez la réponse de @dr. mal, la chaîne de carrière peut se retrouver dans les fichiers journaux et les caches, elle n'est donc pas sécurisée sur le serveur.
zaph
3
Salut zaph, en termes de sécurité HTTPS, l'objectif est d'envoyer des données en toute sécurité au serveur sans que personne au milieu ne puisse les flairer. Bien que cela soit possible et réponde à la question, il est vraiment difficile de contrôler ce que le serveur fait par la suite. C'est pourquoi j'ai également mentionné que ce n'est pas la bonne façon. De plus, vous ne devez jamais envoyer votre mot de passe depuis le client. Vous devez toujours le hacher sur l'appareil et envoyer la valeur de hachage au serveur.
Ruchira Randana
Du point de vue de la sécurité, l'envoi d'informations confidentielles dans la chaîne de carrière n'est pas sécurisé, il est préférable de l'envoyer dans un POST. De plus, le mot de passe est généralement haché sur le serveur, pas par le client. La déclaration « vous ne devriez jamais envoyer ur mot de passe du client » est en conflit avec la réponse: (e.g http://example.com/login?username=alice&password=12345).
zaph
Le hachage @RuchiraRandana sur le client est inutile car la clé privée est ensuite facilement récupérée depuis le frontal.
James W
@JamesW " la clé privée est alors facilement récupérée depuis le frontend" Quelle clé?
curiousguy
28

Oui. Le texte entier d'une session HTTPS est sécurisé par SSL. Cela inclut la requête et les en-têtes. À cet égard, un POST et un GET seraient exactement les mêmes.

En ce qui concerne la sécurité de votre méthode, il n'y a pas de véritable moyen de dire sans inspection appropriée.

shoosh
la source
27
La sécurité ne se limite pas à la communication entre le navigateur et le serveur
JoeBloggs
26

SSL se connecte d'abord à l'hôte, donc le nom d'hôte et le numéro de port sont transférés en texte clair. Lorsque l'hôte répond et que le défi réussit, le client crypte la requête HTTP avec l'URL réelle (c'est-à-dire quoi que ce soit après la troisième barre oblique) et l'envoie au serveur.

Il existe plusieurs façons de briser cette sécurité.

Il est possible de configurer un proxy pour agir comme un "homme au milieu". Fondamentalement, le navigateur envoie la demande de connexion au serveur réel au proxy. Si le proxy est configuré de cette façon, il se connectera via SSL au serveur réel mais le navigateur parlera toujours au proxy. Ainsi, si un attaquant peut accéder au proxy, il peut voir toutes les données qui le traversent en texte clair.

Vos demandes seront également visibles dans l'historique du navigateur. Les utilisateurs pourraient être tentés de mettre le site en signet. Certains utilisateurs ont installé des outils de synchronisation de signets, de sorte que le mot de passe pourrait se retrouver sur deli.ci.us ou un autre endroit.

Enfin, quelqu'un a peut-être piraté votre ordinateur et installé un enregistreur de clavier ou un grattoir d'écran (et beaucoup de virus de type cheval de Troie le font). Étant donné que le mot de passe est visible directement sur l'écran (par opposition à "*" dans une boîte de dialogue de mot de passe), c'est un autre trou de sécurité.

Conclusion: en matière de sécurité, comptez toujours sur les sentiers battus. Il y a trop de choses que vous ne savez pas, auxquelles vous ne penserez pas et qui vous briseront le cou.

Aaron Digulla
la source
3
"le navigateur parlera toujours au proxy" pas tout à fait vrai, il devra présenter au navigateur un certificat valide que le proxy ne peut générer que s'il a le contrôle d'une autorité de certification approuvée par le navigateur.
Pieter
11

Oui, tant que personne ne regarde par-dessus votre épaule vers le moniteur.

Ali Afshar
la source
13
et votre navigateur ne sauvegarde pas l'historique :)
Rahul Prasad
10

Je ne suis pas d'accord avec l'énoncé sur la fuite [...] de référents HTTP (une image externe dans la page cible pourrait divulguer le mot de passe) dans la réponse de Slough .

La RFC HTTP 1.1 indique explicitement :

Les clients NE DEVRAIENT PAS inclure un champ d'en-tête Referer dans une requête HTTP (non sécurisée) si la page de référence a été transférée avec un protocole sécurisé.

Quoi qu'il en soit, les journaux du serveur et l'historique du navigateur sont des raisons plus que suffisantes de ne pas placer de données sensibles dans la chaîne de requête.

Arnout
la source
2
Il y a encore ce mot «devrait». Souhaitez-vous faire confiance à chaque version de chaque navigateur avec votre mot de passe?
JoeBloggs
1
Comment est-ce exactement lié à GET vs POST? "Chaque version de chaque navigateur" serait-elle sûre si vous utilisez POST sur HTTPS?
Arnout
2
En outre, la page Web HTTPS peut récupérer une image externe via HTTPS - dans ce cas, le navigateur DEVRAIT inclure l'en-tête du référent et exposer ainsi votre mot de passe ...
AviD
3
@Arnout: Veuillez lire ce RFC qui vous dit ce qui NE DEVRAIT PAS signifier: ietf.org/rfc/rfc2119.txt Ce n'est PAS la même chose que NE DOIT PAS, donc la partie que vous avez citée n'est pas vraiment pertinente et les agents de navigateur peuvent toujours inclure un référent à HTTP.
Andy
8

Oui, à partir du moment où vous établissez une connexion HTTPS, tout est sécurisé. La chaîne de requête (GET) en tant que POST est envoyée via SSL.

Drejc
la source
-4

Vous pouvez envoyer un mot de passe en tant que paramètre de hachage MD5 avec du sel ajouté. Comparez-le côté serveur pour l'authentification.

Amareswar
la source
11
MD5 n'est pas une fonction de hachage appropriée pour les mots de passe.
slawek
1
Qu'il soit haché ou en texte clair, il est déconseillé d'envoyer des mots de passe dans les paramètres GET. Veuillez vous référer à la réponse la plus votée pour des explications. Aaaand ... MD5 ne devrait plus être utilisé nulle part ...
Thomas
" fonction de hachage non appropriée pour les mots de passe " Encore mieux que d'envoyer des mots de passe en texte clair au serveur, lol
curiousguy