Как изменить порядок заголовков HTTP?
Мне было интересно, есть ли способ переупорядочить заголовки HTTP, которые отправляются нашим браузером, перед отправкой обратно на веб-сервер?
Поскольку порядок заголовков оставляет некоторую "дактилоскопию", см. Этот пост и этот пост, я думал об использовании MITMProxy (с Inline Scripting, я полагаю) для изменения заголовков на лету. Это возможно?
Как достичь этого?
Примечание: я ищу метод, который можно было бы написать в сценарии, а не метод, использующий графический инструмент, такой как Burp Suite (хотя известно, что Burp может переупорядочивать заголовки)
Я открыт для предложений. Возможно, NGINX тоже может прийти на помощь?
РЕДАКТИРОВАТЬ: я должен быть более конкретным, приводя пример...
Допустим, я использую Firefox. С помощью прикольного дополнения я подделываю свой пользовательский агент, чтобы "выглядеть" как браузер Chrome. Но затем, если я протестирую свой браузер с http://ip-check.info/, "подпись" моего браузера останется той же, что и у Firefox, хотя мой поддельный пользовательский агент показывает "Chrome".
Таким образом, решение, в данном конкретном случае, должно состоять в том, чтобы переупорядочивать заголовки HTTP таким же образом, как в Chrome.
Как это может быть сделано?
1 ответ
Для записи, порядок заголовков HTTP не должен иметь значения вообще согласно RFC 7230. Но теперь, когда вы спросили... это можно сделать в mitmproxy следующим образом:
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)
Смотрите подробности в документации по mitmproxy на netlib.http.Headers.
Существует множество способов изменить их порядок, как вы пожелаете:
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)