web-dev-qa-db-fra.com

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

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

320
John

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

  • Généralement, fuite de référenceur HTTP (une image externe de la page cible risque de perdre le mot de passe [1])
  • Le mot de passe sera stocké dans les journaux du serveur (ce qui est évidemment mauvais)
  • Historique des caches 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 une chaîne de requêtes.

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

418
dr. evil

Du point de vue du "sniff the network packet", une requête GET est sécurisée, le navigateur établissant d’abord la connexion sécurisée, puis envoyant la requête contenant les paramètres GET. Mais les URL GET seront stockées dans l'historique du navigateur de l'utilisateur/la saisie semi-automatique, ce qui n'est pas un bon endroit pour stocker, par exemple. mot de passe dans. Bien sûr, cela ne s'applique que si vous prenez la définition plus large de "Webservice" pouvant accéder au service à partir d'un navigateur. Si vous n'y accédez que depuis votre application personnalisée, cela ne devrait pas poser de problème.

Donc, utiliser post au moins pour les dialogues de mot de passe devrait être préféré. Aussi, comme indiqué dans le lien, littlegeek a posté une URL GET est plus susceptible d'être écrit dans les journaux de votre serveur.

69
VolkA

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 de transport. La connexion SSL est établie en premier, puis les paramètres de requête (appartenant au protocole HTTP) sont envoyés au serveur.

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

https://example.com/login?username=alice&password=12345)
  1. Votre client (navigateur/application mobile, par exemple) va d'abord résoudre votre nom de domaine example.com en une adresse IP (124.21.12.31) à l'aide d'une requête DNS. Lors de l'interrogation de ces informations, seules les informations spécifiques à un domaine sont utilisées, c'est-à-dire que seul example.com sera utilisé.
  2. Votre client essaiera maintenant de se connecter au serveur avec l'adresse IP 124.21.12.31 et tentera de se connecter au port 443 (le port du service SSL n'est pas le port HTTP 80 par défaut).
  3. Maintenant, le serveur sur example.com enverra 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, vos paramètres de requête sont alors envoyés via la connexion sécurisée.

Par conséquent, vous n'exposerez pas de données sensibles. Toutefois, l'envoi de vos informations d'identification via une session HTTPS à l'aide de cette méthode n'est pas la meilleure solution. Vous devriez aller pour une approche différente.

37
Ruchira Randana

Oui. Le texte intégral 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’existe aucun moyen réel de le dire sans une inspection adéquate.

25
shoosh

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

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

Il est possible de configurer un proxy pour qu'il agisse en "homme du milieu". Fondamentalement, le navigateur envoie la demande de connexion au serveur réel au proxy. Si le proxy est configuré de cette manière, il se connectera via SSL au serveur réel, mais le navigateur communiquera toujours avec le proxy. Ainsi, si un attaquant peut accéder au proxy, il peut voir toutes les données qui y circulent en texte clair.

Vos demandes seront également visibles dans l'historique du navigateur. Les utilisateurs peuvent être tentés de créer un signet sur le site. Certains utilisateurs ont installé des outils de synchronisation des signets afin que le mot de passe puisse se retrouver sur deli.ci.us ou un autre emplacement.

Enfin, il est possible que quelqu'un ait piraté votre ordinateur et installé un enregistreur de clavier ou un grattoir d'écran (et de nombreux virus de type Cheval de Troie le font). Étant donné que le mot de passe est visible directement à l'écran (par opposition à "*" dans une boîte de dialogue de mot de passe), il s'agit d'une autre faille de sécurité.

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

22
Aaron Digulla

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

10
Ali Afshar

Je ne suis pas d'accord avec l'affirmation à propos de [...] fuite de référent HTTP (une image externe de la page cible risque de fuir le mot de passe) dans - réponse de Slough .

Le HTTP 1.1 RFC stipule explicitement :

Les clients NE DEVRAIENT PAS inclure de champ d’en-tête de référent dans une requête HTTP (non sécurisée) si la page de renvoi 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 amplement suffisantes pour ne pas placer de données sensibles dans la chaîne de requête.

9
Arnout

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.

8
Drejc