Как изменить порядок заголовков 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)
Другие вопросы по тегам