Какие данные отправляет API-интерфейс request.get? - PullRequest
0 голосов
/ 11 июня 2019

У меня есть очень простой вопрос о функции запроса в Python. Я делаю запросы. Получить внешний API из корпоративной сети. Я указал прокси (пользователь: pw @ адрес: порт) и верифицировал (путь к сертификату). К сожалению, это приводит к ошибке SSL, вызванной брандмауэром. Теперь я попросил моего коллегу из ИТ-отдела указать параметр verify = False. В этом случае запросы работают, и я получаю свой результат. Так как я не отправляю / не получаю конфиденциальные данные, я не против проблем с безопасностью. (чисто теоретический) Мои опасения больше связаны с данными прокси, которые я предоставил. Поскольку они имеют мой личный идентификатор и PW, я хочу быть уверенным, что эти данные не покидают сеть компании, а используются только для аутентификации через прокси.

Как работает функция request.get и какую информацию она отправляет в конечный API? Аутентификация прокси также отправляется в финальный API или только для прокси корпоративной сети?

1 Ответ

0 голосов
/ 12 июня 2019

ТЛ; др
Данные proxies не являются частью запроса, отправляемого на удаленный сервер.


Как работает функция requests.get ...

requests удобно оборачивает нижестоящие библиотеки. Внутри он использует urllib3, который использует http.client, который использует socket. Все дело в отправке и получении байтов через сетевой сокет.

В конечном итоге requests создает объект PreparedRequest. Этот объект запроса, соотв. данные в его атрибутах отправляются через сокет INET, которым управляет urllib3.connection.HTTPConnection, класс, производный от http.client.HTTPConnection. Это соединение управляется urllib3.connectionpool.ConnectionPool, который управляется urllib3.poolmanager.Poolmanager, который является частью requests.adapters.HTTPAdapter. На этот HTTPAdapter есть ссылка в requests.sessions.Session, который создается и используется с requests.api.get() по requests.api.request().


... и какую информацию он отправляет в окончательный API?

Параметры, указанные в вызове requests.get, используются для создания запроса, который вы хотите отправить, и / или для соединения, через которое этот запрос отправляется.

Параметры, заканчивающиеся в запросе: method, url, headers, files, data, json, params, auth и cookies.
Параметры, такие как verify, timeout или proxies, используются исключительно для установления и управления соединениями и не отображаются в запросе.

Чтобы показать, что отправлено, вот маленькая, глупая и совершенно непригодная для чего-либо удаленная конечная точка сокета:

import socket

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.bind(('', 42424))
    s.listen(1)
    while True:
        conn, addr = s.accept()
        with conn:
            data = conn.recv(1024)
            print(data.decode())

И наш клиент:

import requests

params = {'foo': 'bar'}
requests.get("http://127.0.0.1:42424", params=params)

«Сервер» печатает:

GET /?foo=bar HTTP/1.1
Host: 127.0.0.1:42424
User-Agent: python-requests/2.18.4
Accept-Encoding: gzip, deflate
Accept: */*
Connection: keep-alive

Помещение очень простого прокси между этими двумя ...

from socketserver import ThreadingTCPServer
import urllib.request
from http.server import SimpleHTTPRequestHandler

class Proxy(SimpleHTTPRequestHandler):
    def do_GET(self):
        self.copyfile(urllib.request.urlopen(self.path), self.wfile)

httpd = ThreadingTCPServer(('', 42425), Proxy)
httpd.serve_forever()

(Этот рецепт был явно украден (и откорректирован для Python 3) у Фредрика Лунда на effbot.org )

... и использование proxies на requests.get вызове ...

params = {'foo': 'bar'}
proxies = {'http': '127.0.0.1:42425'}
requests.get("http://127.0.0.1:42424", params=params, proxies=proxies)

... приводит к тому, что сервер получает следующее:

GET /?foo=bar HTTP/1.1
Accept-Encoding: identity
Host: 127.0.0.1:42424
User-Agent: Python-urllib/3.6
Connection: close

Таким образом, учетные данные, указанные в proxies, хранятся между прокси-сервером и вашим клиентом.

...