Comment réorganiser les en-têtes HTTP?

Je me demandais s’il était possible de commander à nouveau les en-têtes HTTP envoyés par notre navigateur avant d’être renvoyés au serveur Web?

Comme l’ordre des en-têtes laisse une sorte de “fingerprinting”, voir cet article et ce post , je pensais utiliser MITMProxy (avec des scripts en ligne, je suppose) pour modifier les en-têtes à la volée. Est-ce possible?

Comment pourrait-on y arriver?
Note: Je cherche une méthode qui pourrait être scriptée, pas une méthode utilisant un outil graphique comme Burp Suite (bien que Burp soit connu pour pouvoir réordonner les en-têtes)

Je suis ouvert aux suggestions. Peut-être que NGINX pourrait aussi venir à la rescousse?

EDIT: Je devrais être plus précis, en donnant un exemple …

Disons que j’utilise Firefox. Avec l’utilisation d’un add-on funky, je fausse mon agent utilisateur pour qu’il “ressemble” à un navigateur Chrome. Mais alors, si je teste mon navigateur avec ip-check.info , la “signature” de mon navigateur rest celle de Firefox, même si mon agent d’ usurpation d’ identité affiche “Chrome”.

La solution consiste donc, dans ce cas précis, à réorganiser les en-têtes HTTP de la même manière que Chrome.

Comment cela peut-il être fait?

Pour l’enregistrement, l’ordre des en-têtes HTTP n’a aucune importance selon la RFC 7230 . Mais maintenant que vous avez demandé … cela peut être fait dans mitmproxy comme suit:

import random def request(context, flow): # flow.request.headers.fields is a tuple of (name, value) header tuples. h = list(flow.request.headers.fields) random.shuffle(h) flow.request.headers.fields = tuple(h) 

Consultez la documentation de mitmproxy sur netlib.http.Headers pour plus de détails.

Il y a des tonnes de moyens de les réorganiser comme vous le souhaitez:

 def reorder(headers, header_order=["Host","User-Agent","Accept"]): lines = [] for name in header_order: # add existing headers in the specified order if name in headers: lines.extend(headers.get_all(name)) del headers[name] lines.extend(headers.fields) # all other headers return lines request.headers.fields = reorder(request.headers)