web-dev-qa-db-fra.com

HTTPS POST en-tête de demande versus corps de demande

Existe-t-il une différence de sécurité entre le placement de données sensibles, telles qu'une clé API dans une demande POST en-tête et POST - corps en supposant que le serveur API est uniquement HTTPS?

Bien que vous voyiez fréquemment des clés API dans l'en-tête d'autorisation ou un en-tête X-API-KEY personnalisé, le fait de placer la clé dans l'en-tête augmente-t-il réellement le niveau de sécurité de la clé ou s'agit-il strictement d'une convention de conception d'API?

18
pxwise

Si le transport lui-même est sécurisé (c'est-à-dire https), un attaquant ne peut pas renifler les données. Mais il peut être enregistré côté serveur et le serveur peut être compromis ultérieurement ou une fuite de sécurité peut rendre les fichiers journaux visibles par le public. Ces fichiers journaux contiennent généralement l'URL et peuvent contenir d'autres lignes des en-têtes comme User-Agent, Referer et d'autres en-têtes s'ils sont spécifiés avec un format de journal personnalisé. Ainsi, il pourrait être une mauvaise idée de mettre ces clés API dans l'en-tête de la demande, sauf si vous vous assurez qu'elles ne sont pas enregistrées.

Un argument contre la mise de la clé dans le corps de la demande est qu'il serait désormais possible de créer un simple formulaire HTTP qui comprend la clé qui est plus facile à utiliser comme une demande CSRF. Lorsqu'il inclut la clé API comme en-tête à la place, l'attaquant doit être capable de faire une requête XHR et est soumis aux restrictions de CORS .

Une autre raison pour ne pas inclure la clé dans l'URL est qu'elle pourrait être incluse dans l'en-tête Referer d'une demande suivante. De plus, les URL sont généralement contenues dans l'historique des navigateurs afin que vous ayez un autre endroit qui pourrait être compromis. Cela n'est pertinent que pour les demandes de navigateur normales, c'est-à-dire XHR ou REST effectuées par les applications ne sont pas affectées.

Quelques explications sur la signification de "header": parfois on utilise le nom 'header' pour distinguer la partie initiale du message HTTP et le corps. Dans ce cas, l'URL fait partie de l'en-tête (ligne de demande). D'autres fois, on parle des en-têtes (pluriel) et signifie uniquement les paires "champ: valeur", c'est-à-dire sans inclure la ligne de demande avec l'URL. Je ne sais pas très bien quel sens est utilisé dans la question, donc je ferais mieux de couvrir les deux.

15
Steffen Ullrich

Je ne pense pas qu'il y ait un avantage de sécurité significatif à l'utiliser dans un en-tête HTTP (sans compter l'URL qui est envoyée dans la ligne de demande qui démarre la demande HTTP, où vous devez être plus conscient de son enregistrement dans l'historique de votre navigateur ou journaux de serveur) vs être dans un corps de requête POST.

L'avantage d'envoyer des clés dans un "en-tête d'autorisation ou un en-tête X-API-KEY personnalisé" serait la séparation et la cohérence entre plusieurs méthodes dans votre API. Autrement dit, vous pouvez gérer l'authentification avec le même code de serveur pour les méthodes GET, POST, PUT, etc. en vérifiant le champ d'en-tête utilisé par l'API. De plus, si l'utilisateur doit soumettre d'autres données POST/PUT dans le corps de la demande dans le cadre de sa demande d'API, celles-ci sont conservées séparées des données d'authentification.

5
dr jimbob