Поиск по блогу

суббота, 14 июня 2014 г.

Видео о Privoxy -> Стандарты HTTP/1.1 -> Proxy_server forensicswiki -> Apache Module mod_proxy

В конфиг Privoxy можно навтыкать HTTP-заголовков. Это окрытие сподвигло меня на розыски стандарта HTTP/1.1 rfc2616. Оказалось, что там нет вызовов к прокси-серверу... да и заголовки "Proxy-Connection" применяются нестандартные... Масла в огонь подлил Fiddler... Здесь ссылки на уйму стандартов, но окончательный ответ так и не найден
В документации к Hypertext Transfer Protocol -- HTTP/1.1 rfc2616 есть немного о прокси-серверах в разделе 14.10 Connection
Вот, как нужно экономить место - вставлять текст справа от видео, вставим в открывающий тег фрейма вот такой стиль:
In []:
style="float:left; margin-right: 10px;"

Если погуглить "Privoxy", то можно найти ролики про настройки конфигурационного файла. В него просто можно добавлять строки http-заголовки. И при помощи этих заголовков подделать все, что угодно. Вот коротенький ролик на эту тему.
Очевидная мысль о том, что проще посмотреть http-headers после сервера, чем изучать тысячи строк конфиг-файлов... пришла ко мне в голову столь неочевидно. Начнем изучение с Википедии:
X-Forwarded-For
Proxy server
Anonymizer
Comparison of proxifiers
Tunneling protocol
List of HTTP header fields
HTTP Header Field Registrations rfc4229
Set up an HTTP proxy to insert a header
Proxy_server forensicswiki
Apache Module mod_proxy
In []:
#В конфигурационном файле есть вот такие строки

## Turn some actions on ################################
        { \
        -add-header \
        
#...
# Вот это из видео (синтаксис не понимаю... видно плохо...)
{\        
+add-header {change-x-forwarded-for: 80.22.66.213}\
+add-header {host: 222:333:33:22}\
+limit-connect {80,443)\
}
Код наверху - это моя попытка просто записать то, о чем говорилось в ролике. Чтобы ротировать прокси надо на ходу подменять конфигурационные файлы. Что, конечно, возможно, но довольно глупо. Чем меня Питон не устраивает? За что боролись? Тема эта уде дветс свои плоды ...поюзал (Burp, WireShark, OWAS zap, Fiddler - прокси-перехватчики), в данный момент умиляюсь, глядя на то, как Fiddler вытаскивает заголовки типа:
In []:
User-Agent: WindowsConnectedSearch/1.0 (Windows NT 6.3.0.0.9600.12;x64;SAMSUNG+ELECTRONICS+CO%2E%2C+LTD%2E;355V4C%2F356V4C%2F3445VC%2F3545VC;Mobile;6.3.0;)
А в красивом описании с картинками мне написали, что Note that Fiddler does not support upstream proxy configuration scripts that are accessed using the FILE:// protocol, only those accessed using the HTTP or HTTPS protocols (so far, no one seems to have hit this limitation in the last 6 years).
Я еще не решил, как бороться с этим вызовм (и стоит ли), а мозгу уже хочется зайти в Гугл - приложения. Там какие-то прокси болтались...

Чтобы закончить этот пост надо поянять, а как же происходят переговоры с браузера с прокси-сервером?

Действительно, какие заголовки вставлять? А самое главное, куда... Пробуем построить цепочку Chain Fiddler to an Upstream Proxy
In [5]:
from IPython.display import HTML, Image
In [7]:
Image('http://docs.telerik.com/fiddler/images/default-source/SetProxyAddress.jpg')
Out[7]:
To configure Fiddler to send and receive web traffic to and from another proxy between Fiddler and the destination server: Close Fiddler. Open Internet Explorer > Options > Internet Options > Connections > LAN Settings. Click the check box by Use a proxy server for your LAN. Type the address and port number for the upstream proxy. Restart Fiddler. You should now see the upstream proxy listed in the Fiddler About dialog.
In [8]:
HTML('http://lib.ru/WEBMASTER/rfc2068/section-8.html')
Out[8]:
HTTP 1.1 - Соединения (Connections).

8 Соединения (Connections).

8.1 Постоянные соединения (Persistent Connections).

8.1.1 Цель.

До постоянных соединений для запроса каждого URL устанавливалось отдельное TCP соединение, что увеличивало нагрузку на HTTP сервера и вызывало загрузку Интернета. Использование встроенных изображений и других связанных данных часто требует от клиента делать несколько запросов к одному серверу за короткий промежуток времени. Исследования проблем эффективности такого решения доступны в [30][27]; анализ и результаты реализации прототипа находятся в [26].
Постоянные HTTP соединения имеют ряд преимуществ:
  • Открытие и закрытие меньшего количества TCP соединений экономит время центрального процессора и память, используемую для управляющих блоков протокола TCP.
  • HTTP запросы и ответы может быть конвейеризованы в соединении. Конвейерная обработка позволяет клиенту делать множество запросов не ожидая ответа на каждый, следовательно, одиночное TCP соединение, использование которого намного более эффективно, теряет меньше времени.
  • Загрузка сети уменьшается с уменьшением числа пакетов, вызванных открытием TCP соединений, и, следовательно, дает протоколу TCP достаточное время для определения состояния загрузки сети.
  • HTTP может развиваться более элегантно; так как ошибки могут сообщаться без закрытия TCP соединения в качестве штрафа. Клиенты, использующие будущие версии HTTP могли бы оптимистично пробовать новые возможности, но при связи со старым сервером, повторять запрос, используя старую семантику после сообщения об ошибке.
HTTP реализациям СЛЕДУЕТ реализовывать постоянные соединения.

8.1.2 Общее описание.

Значительное отличие HTTP/1.1 от более ранних версий HTTP состоит в том, что постоянные соединения являются заданным по умолчанию поведением любого HTTP соединения. То есть если не обозначено иного, клиент может считать, что сервер поддержит постоянное соединение.
Постоянные соединения обеспечивают механизм, согласно которому клиент и сервер могут сообщить о разрыве TCP соединения. Это сигнализируется при помощи использования поля заголовка Connection. При получении сообщения о разрыве соединения клиент НЕ ДОЛЖЕН посылать больше запросов по этому соединению.

8.1.2.1 Обсуждение (Negotiation).

HTTP/1.1 сервер МОЖЕТ считать, что HTTP/1.1 клиент не предполагает поддерживать постоянное соединение, если посланный в запросе заголовок Connection содержит лексему соединения (connection-token) "close". Если сервер решает закрыть соединение немедленно после посылки ответа, то ему СЛЕДУЕТ послать заголовок Connection, который содержит лексему соединения (connection-token) "close".
HTTP/1.1 клиент МОЖЕТ ожидать, что соединение останется открытым, но должен решить оставлять ли его открытым на основании того, содержит ли ответ сервера заголовок Connection с лексемой соединения "close". В случае, если клиент не хочет поддерживать соединение для последующих запросов, ему СЛЕДУЕТ послать заголовок Connection, содержащий лексему соединения "close".
Если клиент или сервер посылает лексему закрытия соединения "close" в заголовке Connection, то запрос становится последним в соединении.
Клиентам и серверам НЕ СЛЕДУЕТ считать, что постоянное соединение поддерживается HTTP версиями, меньшими чем 1.1, если это не указано явно. Смотрите раздел 19.7.1 с более подробной информацией о обратной совместимости с HTTP/1.0 клиентами.
Чтобы соединение оставалось постоянным, все сообщения, передаваемые по нему должны иметь самоопределенную (self-defined) длину сообщения (то есть, не определяемую закрытием соединения), как описано в разделе 4.4.

8.1.2.2 Конвейерная обработка (Pipelining).

Клиент, который поддерживает постоянные соединения МОЖЕТ "произвести конвейерную обработку" запросов (то есть, посылать несколько запросов не ожидая ответа на каждый). Сервер ДОЛЖЕН послать ответы на эти запросы в том же самом порядке, в каком были получены запросы.
Клиенты, которые поддерживают постоянные соединения и производят конвейерную обработку немедленно после установления соединения, ДОЛЖНЫ быть готовы повторить соединение, если первая попытка конвейерной обработки дала сбой. Если клиент делает такой повтор, он НЕ ДОЛЖЕН производить конвейерную обработку прежде, чем узнает, что соединение постоянное. Клиенты ДОЛЖНЫ также быть готовы снова послать запросы, если сервер закрывает соединение перед посылкой всех соответствующих ответов.

8.1.3 Прокси-сервера (Proxy Servers).

Очень важно, чтобы прокси-сервера правильно выполняли свойства полей заголовка Connection, как определено в 14.2.1.
Прокси-сервер ДОЛЖЕН сообщать о постоянных соединениях отдельно своим клиентам и отдельно первоначальным серверам (или другим прокси-серверам), которые с ним соединены. Каждое постоянное соединение применяется только к одной транспортной связи.
Прокси-сервер НЕ ДОЛЖЕН устанавливать постоянное соединение с HTTP/1.0 клиентом.

8.1.4 Практические cоглашения (Practical Considerations).

Сервера обычно имеют некоторое значение времени ожидания, после которого они не поддерживают неактивное соединение. Прокси-сервера могут делать это значение более высоким, так как, вероятно, клиент сделает большее количество соединений через этот же сервер. Использование постоянных соединений не вводит никаких ограничений на продолжительность этого времени ожидания как для клиента, так и для сервера.
Когда у клиента или сервера истекло время ожидания, ему СЛЕДУЕТ произвести изящное закрытие транспортного соединения. Как клиентам, так и серверам СЛЕДУЕТ постоянно наблюдать за другой стороной на предмет закрытия соединения, и соответственно отвечать. Если клиент или сервер не обнаруживает закрытия соединения другой стороной сразу, то это вызывает не оправданную трату ресурсов сети.
Клиент, сервер, или прокси-сервер МОГУТ закрыть транспортное соединение в любое время. Например, клиент МОЖЕТ начать посылать новый запрос в то время, когда сервер решает закрыть "бездействующее" соединение. С точки зрения сервера, соединение закрывается, в то время как оно было неактивно, но с точки зрения клиента, запрос произошел.
Это означает, что клиенты, серверы, и прокси-серверы ДОЛЖНЫ быть в состоянии обрабатывать асинхронные события закрытия. Программному обеспечению клиента СЛЕДУЕТ вновь открыть транспортное соединение и повторно передать прерванный запрос без взаимодействия с пользователем, поскольку метод запроса idempotent (смотрите раздел 9.1.2); другие методы НЕ ДОЛЖНЫ быть повторены автоматически, хотя агенты пользователя МОГУТ предложить оператору выбор повторять запрос, или нет.
Однако это автоматическое повторение НЕ СЛЕДУЕТ производить, если сбой происходит уже во втором запросе.
Серверам всегда СЛЕДУЕТ отвечать на по крайней мере на один запрос в соединении, если это возможно. Серверам НЕ СЛЕДУЕТ разрывать соединение в середине передачи ответа, если не предполагается сетевой или клиентский отказ.
Клиентам, использующим постоянные соединения, СЛЕДУЕТ ограничить число одновременных соединений, которые они устанавливают с данным сервером. Однопользовательскому клиенту СЛЕДУЕТ устанавливать максимум 2 соединения с любым сервером или прокси-сервером. Прокси-серверу СЛЕДУЕТ ограничиться 2*N соединеними с другими серверами или прокси-серверами, где N - число одновременно активных пользователей. Эти руководящие принципы предназначены для уменьшения времени HTTP ответа и избежания чрезмерной загрузки Интернета или других сетей.

8.2 Требования к передаче сообщений.

Общие требования:
  • HTTP/1.1 серверам СЛЕДУЕТ поддерживать постоянные соединения и использовать механизмы управления потоком данных TCP в целях уменьшения временных перегрузок, вместо закрытия соединений, которые, как ожидается, могут быть повторно использованы клиентами. Последняя методика может усиливать сетевую загрузку.
  • HTTP/1.1 (или более поздним) клиентам, посылающим тело сообщения (message-body) СЛЕДУЕТ контролировать сетевое соединение на предмет ошибок во время передачи запроса. Если клиент обнаруживает ошибку, ему СЛЕДУЕТ немедленно прекратить передачу тела сообщения. Если тело посылается с использованием кодирования "по кускам" ("chunked", раздел 3.6), то кусок нулевой длины, и пустой завершитель МОГУТ использоваться для индикации преждевременного конца сообщения. Если телу предшествовал заголовок Content-Length, клиент ДОЛЖЕН закрыть соединение.
  • HTTP/1.1 (или более поздний) клиент ДОЛЖЕН быть готов принять ответ с кодом состояния 100 (Продолжать, Continue), предшествующий основному ответу.
  • HTTP/1.1 (или более поздний) сервер, который получает запрос от HTTP/1.0 (или более раннего) клиента НЕ ДОЛЖЕН передать ответ с кодом состояния 100 (Продолжать, Continue); ему СЛЕДУЕТ либо ожидать пока запрос будет выполнен обычным образом (то есть без использования прерванного запроса), либо преждевременно закрыть соединение.
После получения метода, подчиненного этим требованиям, от HTTP/1.1 (или более позднего) клиента, HTTP/1.1 (или более поздний) сервер ДОЛЖЕН либо ответить кодом состояния 100 (Продолжать, Continue) и продолжать чтение входного потока, либо ответить ошибочным кодом состояния. Если сервер ответил ошибочным кодом состояния, то он МОЖЕТ либо закрыть транспортное соединение (TCP), либо продолжать читать и отбрасывать оставшуюся часть запроса. Он НЕ ДОЛЖЕН выполнять запрошенный метод, если возвратил код состояния ошибки.
Клиентам СЛЕДУЕТ помнить номер версии HTTP, используемой сервером по крайней мере в последний раз; если HTTP/1.1 клиент встречал HTTP/1.1 или более поздний ответ от сервера, и видит закрытие соединения перед получением какого-либо кода состояния от сервера, клиенту СЛЕДУЕТ повторить запрос без взаимодействия с пользователем, поскольку метод запроса idempotent (смотрите раздел 9.1.2); другие методы НЕ ДОЛЖНЫ быть повторены автоматически, хотя агенты пользователя МОГУТ предложить оператору выбор повторять запрос, или нет. Если клиент повторяет запрос, то он
  • ДОЛЖЕН сначала послать поля заголовка запроса, а затем
  • ДОЛЖЕН ожидать ответа сервера с кодом 100 (Продолжать, Continue), а затем продолжать, или с кодом состояния ошибки.
Если HTTP/1.1 клиент не встречал ответа сервера версии HTTP/1.1 или более поздней, то ему следует считать, что сервер реализует HTTP/1.0 или более старый протокол и не использовать ответы с кодом состояния 100 (Продолжать, Continue). Если в такой ситуации клиент видит закрытие соединения перед получением какого-либо ответа с кодом состояния от сервера, то ему СЛЕДУЕТ повторить запрос. Если клиент повторяет запрос к этому HTTP/1.0 серверу, то он должен использовать следующий "binary exponential backoff" алгоритм, чтобы быть уверенным в получении надежного ответа:
  1. Инициализировать новое соединение с сервером.
  2. Передать заголовки запроса (request-headers).
  3. Инициализировать переменную R примерным временем передачи информации на сервер и обратно (например на основании времени установления соединения), или постоянным значение в 5 секунд, если время передачи не доступно.
  4. Вычислить T = R * (2**N), где N - число предыдущих повторов этого запроса.
  5. Либо дождаться от сервера ответа с кодом ошибки, либо просто выждать T секунд (смотря что произойдет раньше).
  6. Если ответа с кодом ошибки не получено, после T секунд передать тело запроса.
  7. Если клиент обнаруживает, что соединение было закрыто преждевременно, то ему нужно повторять начиная с шага 1, пока запрос не будет принят, либо пока не будет получен ошибочный ответ, либо пока у пользователя не кончится терпение и он не завершит процесс повторения.
Независимо от того, какая версия HTTP реализована сервером, если клиент получает ошибочный код состояния, то он
  • НЕ ДОЛЖЕН продолжать и
  • ДОЛЖЕН закрыть соединение, если он не завершил посылку сообщения.
HTTP/1.1 (или более позднему) клиенту, который обнаруживает закрытие соединения после получения ответа с кодом состояния 100 (Продолжать, Continue), но до получения ответа с другим кодом состояния, СЛЕДУЕТ повторить запрос, но уже не ожидать ответа с кодом состояния 100 (Продолжать, Continue) (но он МОЖЕТ сделать так, если это упрощает реализацию).


Copyright  ©  1998 Alex Simonoff (http://www.omsk.com/Leshik/), All Rights Reserved.

Этот перевод нельзя назвать новым. Потому вот ссылка на сообщество разработчиков Mozilla: HTTP message headers are used to precisely describe the resource being fetched or the behavior of the server or the client. Headers
In [10]:
HTML('http://homepage.ntlworld.com/jonathan.deboynepollard/FGA/web-proxy-connection-header.html')
Out[10]:
FGA: The Proxy-Connection: header is a mistake in how some web browsers use HTTP.

The Proxy-Connection: header is a mistake in how some web browsers use HTTP.

You've come to this page because you've asked questions similar to the following:
What is the Proxy-Connection: header in HTTP? It isn't documented in any standards document.
This is the Frequently Given Answer to such questions.
The Proxy-Connection: header is a mistake in how some web browsers use HTTP. Its name is the result of a false analogy. It is not a standard part of the protocol. There is a different standard protocol mechanism for doing what it does. And its existence imposes a requirement upon HTTP servers such that no proxy HTTP server can be standards-conforming in practice.
The mechanism that the Proxy-Connection: header is intended to provide is a mechanism for negotiating the persistence of a single connection between a given client and a given proxy server. By default, an HTTP version 1.0 connection is non-persistent and an HTTP version 1.1 connection is persistent. The Proxy-Connection: header is intended as a mechanism for negotiating the non-default behaviour:
  • A client using HTTP 1.0 to talk to a proxy server can send Proxy-Connection: keep-alive in a request message to request that the server treat the connection as a persistent connection, if it is capable of doing so.
    Note that this is faulty protocol design that is prone to error, as RFC 2616 § 19.6.2 explains. The client cannot know that a proxy server that only understands HTTP 1.0 will not simply pass the header through, and thus cannot know that the header will be processed by the immediately downstream server (where it needs to be processed in order for connection negotiation to work).
  • A proxy server using HTTP 1.0 to talk to a client can send Proxy-Connection: keep-alive in a response message to inform the client that it will honour a request to treat the connection as a persistent connection.
    As RFC 2616 § 19.6.2 explains, a proxy server cannot reliably do this, because it cannot reliably know that the header came from the client, and not from somewhere upstream of it.
  • A client using HTTP 1.1 to talk to a proxy server can send Proxy-Connection: close in a request message to inform the server that it will be closing the connection after this transaction.
  • A proxy server using HTTP 1.1 to talk to a client can send Proxy-Connection: close in a response message to inform the client that it will be closing the connection after this transaction.
HTTP already has a mechanism for this purpose. It is the Connection: header, documented in RFC 2616 § 14.10. Part of the reason that the Proxy-Connection: header is a mistake is that there is no need for another header to do the same thing. The Connection: header provides exactly the same functionality, less the faulty part, as the Proxy-Connection: header is intended to; and, moreover, provides it for any connection between any HTTP server, content or proxy, and its clients, not just for connections specifically between proxy servers and their clients.
The existence of the Proxy-Connection: header is in part based upon a false analogy to the Authorization: (RFC 2616 § 14.8) and the Proxy-Authorization: (RFC 2616 § 14.34) headers. The former is an end-to-end header, that is passed unchanged through all proxy servers and used by the web browser to communicate with the content server; whereas the latter is a single-hop header, that is not passed through by proxy servers and that is used by a web browser, or by (the back-end of) a proxy server, to communicate with the proxy server that is immediately downstream in the chain of proxy servers leading to the content server. The false analogy is that therefore the Connection: header is an end-to-end header used for talking to content servers, and the Proxy-Connection: is a single-hop header used for talking to the immediately downstream proxy server.
In fact, as RFC 2616 § 14.10 states, the Connection: header is a single-hop header. It is not, after all, meaningful to have an end-to-end persistence negotiation mechanism. Connection persistence is, by its very nature, a single-hop concept.
Unfortunately, existing web browsers employ the Proxy-Connection: header, and, moreover, they choose between it and the Connection: header depending from whether they believe they are talking to a proxy server or to a content server. Netscape Navigator did this originally. In Internet Explorer, Microsoft apparently decided simply to copy what Navigator did. Mozilla does it, too. (And the comment in the Navigator/Mozilla source about what RFC 2616 § 19.6.2 mandates for HTTP 1.1 clients is wrong, to boot. It mandates no such thing.)
The consequence of this is that, despite the fact that it is contrary to RFC 2616 § 4.5, proxy servers must treat the Proxy-Connection: header not as an entity header, but as a general header. In HTTP 1.1 requests, they must treat it as they would treat the Connection: header; and in HTTP 1.0 and earlier requests, they must ignore it and throw it away. Neither is how they would treat an entity header.

© Copyright 2007 Jonathan de Boyne Pollard. "Moral" rights asserted.
Permission is hereby granted to copy and to distribute this web page in its original, unmodified form as long as its last modification datestamp is preserved.
Мда.. Прочитал, удивился... Но тут у меня рояль Фидлер в кустах c записью трафика через внешний прокси. Вот так обновляется открытая страница извесного сайта. Запрос на обновление списка прокси браузер делает периодически и автоматически:
In []:
POST http://hidemyass.com/proxy-list/xhr/update/50?1402330169486 HTTP/1.1
Host: hidemyass.com
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:29.0) Gecko/20100101 Firefox/29.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
DNT: 1
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Referer: http://hidemyass.com/proxy-list/
Content-Length: 3
Cookie: __utma=82459535.1165548706.1401981762.1402326166.1402328724.4; 
    __utmz=82459535.1401981762.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); 
    __ar_v4=YLTDUEAWPJHIJFMVAGPYUQ%3A20140605%3A5%7CTLB3JJA5IBBEZL2JMKN2XC%3A20140605%3A5%7CYDAKKAPYE5FX3FZCFST7SX%3A20140605%3A5; 
    km_ai=cpYOtcj7fjDhuVlS9IYFArVT1nw%3D; 
    km_uq=; 
    km_lv=x; 
    PHPSESSID=fcu4ppj82hbhaf8t9kbfgp3eg7; 
    __utmb=82459535.1.10.1402328724; 
    __utmc=82459535; kvcd=1402328730487; 
    km_vs=1
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache

q=0
Но браузер уже подключен через внешний свободный прокси (см. последнюю строчку) вот, что он отвечает:
In []:
HTTP/1.0 200 OK
Server: nginx
Date: Mon, 09 Jun 2014 15:53:23 GMT
Content-Type: text/html
Content-Length: 22
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Vary: Accept-Encoding
Content-Encoding: gzip
X-Cache: MISS from ru-30.p.com.linkpc.net
Proxy-Connection: keep-alive

Вот фрагмент из стандарта rfc2616

14.10 Connection
The Connection general-header field allows the sender to specify options that are desired for that particular connection and MUST NOT be communicated by proxies over further connections.
The Connection header has the following grammar:
   Connection = "Connection" ":" 1#(connection-token)

   connection-token  = token
HTTP/1.1 proxies MUST parse the Connection header field before a message is forwarded and, for each connection-token in this field, remove any header field(s) from the message with the same name as the connection-token. Connection options are signaled by the presence of a connection-token in the Connection header field, not by any corresponding additional header field(s), since the additional header field may not be sent if there are no parameters associated with that connection option.
В стандарте действительно нет "Proxy-Connection", а в Фидлере нет "connection-token " ... разберемся, но этот пост пора заканчивать...


Посты чуть ниже также могут вас заинтересовать

Комментариев нет:

Отправить комментарий