web-dev-qa-db-fra.com

Est-il sécurisé d'envoyer un nom d'utilisateur et un mot de passe dans un objet Json dans le corps d'une demande de publication?

Je construis une application Web et mon serveur Web est sécurisé, ce qui signifie qu’il utilise un certificat SSL avec l’interface frontale pour chiffrer la connexion.

Lorsqu'un utilisateur se connecte, un objet JSON semblable à celui-ci est créé et envoyé au serveur.

{
    username:"the user's username",
    password:"the user's password"
}

Sur le serveur, cela est vérifié avec un algorithme de hachage utilisant un sel. Une fois la vérification effectuée, un jeton api est créé. Il est valide pendant un certain temps et est passé dans l'en-tête afin de vérifier l'utilisateur lorsque des demandes sont en cours. L'envoi du nom d'utilisateur et du mot de passe est-il conforme à cette pratique exemplaire/sécurisé, ou vaut-il mieux l'envoyer dans l'en-tête?

6
Dan

Permet de le diviser en plusieurs points:

1) vous utilisez un certificat SSL valide pour sécuriser la communication entre l'utilisateur et le serveur (il doit être valide)

2) L'envoi du nom d'utilisateur et du mot de passe dans le corps de la demande POST est la meilleure pratique (n'utilisez jamais GET pour envoyer des informations sensibles telles que des informations d'identification).

3) L'envoi du jeton api dans les en-têtes de demande et de réponse HTTP est la meilleure pratique (n'utilisez jamais GET pour envoyer des informations sensibles telles que des jetons de session)

Donc, sur la base des points ci-dessus, il semble qu’il n’y ait aucun risque dans cette implémentation, mais vous devez tenir compte des points suivants dans votre examen:

1) Le délai d'attente du jeton de l'API doit être court en cas d'utilisateur inactif. (5 ~ 15 min sont les moyennes basées sur la criticité de l'application)

2) La longueur du jeton de l'API doit être longue. 30 ~ 40 caractères.

3) La génération de jetons d'API doit être aléatoire et il est difficile de prévoir contre laquelle protéger (attaques de prédiction de session.)

J'espère que cela vous aidera.

8
kingasmk

Ce que vous décrivez est fondamentalement Authentification de base HTTP .

L'envoi du nom d'utilisateur et du mot de passe est-il conforme à cette pratique exemplaire/sécurisé, ou vaut-il mieux l'envoyer dans l'en-tête?

Du point de vue de la sécurité, je ne peux pas penser à une grande différence si vous envoyez les informations d'identification dans le corps ou dans l'en-tête. Fondamentalement, quiconque parvient à lire le message en texte clair peut voir les informations d'identification dans les deux composants. La pratique courante lors de l'utilisation de l'authentification de base consiste à utiliser l'en-tête HTTP si:

Authorization: Basic VGVzdFVzZXI6UGFzc3dvcmQxMjM0

VGVzdFVzZXI6UGFzc3dvcmQxMjM0 correspond à vos informations d'identification codées en base64. La chaîne décodée dans ce cas est: TestUser:Password1234

Il est important de réaliser que dans votre cas, le protocole TLS constitue la seule protection des informations d'identification en transit. Vous devez donc identifier tous les nœuds du canal de communication susceptibles d'exposer le message en clair. Par exemple, si vous utilisez des serveurs proxy pour terminer le protocole TLS, ceux-ci sont des vecteurs potentiels pour les attaques MITM.

Si vous souhaitez augmenter la sécurité des informations d'identification en transit, vous pouvez, par exemple, implémenter un cryptage asymétrique de bout en bout afin de chiffrer les informations d'identification avec une clé publique authentifiée côté client CA) puis déchiffrez-le à la destination avec la clé privée connue uniquement de votre serveur. Dans ce cas, vous ne devriez pas trop vous inquiéter de ce qu'il advient du message en transit.

2
quinz