В заголовке HTTP запроса Selenium отсутствует ссылка - PullRequest
0 голосов
/ 10 января 2019

Я пишу несколько тестов с Selenium и заметил, что Referer отсутствует в заголовках. Я написал следующий минимальный пример, чтобы проверить это с https://httpbin.org/headers:

import selenium.webdriver

options = selenium.webdriver.FirefoxOptions()
options.add_argument('--headless')

profile = selenium.webdriver.FirefoxProfile()
profile.set_preference('devtools.jsonview.enabled', False)

driver = selenium.webdriver.Firefox(firefox_options=options, firefox_profile=profile)
wait = selenium.webdriver.support.ui.WebDriverWait(driver, 10)

driver.get('http://www.python.org')
assert 'Python' in driver.title

url = 'https://httpbin.org/headers'
driver.execute_script('window.location.href = "{}";'.format(url))
wait.until(lambda driver: driver.current_url == url)
print(driver.page_source)

driver.close()

Какие отпечатки:

{
  "headers": {
    "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", 
    "Accept-Encoding": "gzip, deflate, br", 
    "Accept-Language": "en-US,en;q=0.5", 
    "Connection": "close", 
    "Host": "httpbin.org", 
    "Upgrade-Insecure-Requests": "1", 
    "User-Agent": "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:64.0) Gecko/20100101 Firefox/64.0"
  }
}

Так что нет Referer. Однако, если я перехожу на любую страницу и вручную выполняю

window.location.href = "https://httpbin.org/headers"

в консоли Firefox, Referer действительно отображается как ожидалось.


Как указано в комментариях ниже, при использовании

driver.get("javascript: window.location.href = '{}'".format(url))

вместо

driver.execute_script("window.location.href = '{}';".format(url))

запрос включает Referer. Кроме того, при использовании Chrome вместо Firefox оба метода включают Referer.

Таким образом, главный вопрос остается открытым: почему Referer отсутствует в запросе при отправке с Firefox, как описано выше?

1 Ответ

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

Referer согласно документации MDN

Заголовок запроса Referer содержит адрес предыдущей веб-страницы, с которой следовала ссылка на запрашиваемую в данный момент страницу. Заголовок Referer позволяет серверам определять, откуда люди их посещают, и может использовать эти данные, например, для аналитики, ведения журнала или оптимизированного кэширования.

Важно. Хотя этот заголовок используется во многих невинных целях, он может иметь нежелательные последствия для безопасности и конфиденциальности пользователей.

Источник: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Referer


Тем не менее:

Заголовок Referer не отправляется браузерами, если:

  • Ссылающийся ресурс - это локальный URI "file" или "data".
  • Используется незащищенный HTTP-запрос, и ссылающаяся страница была получена по безопасному протоколу (HTTPS).

Источник: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Referer


Конфиденциальность и безопасность

С заголовком Referer HTTP связаны некоторые риски для конфиденциальности и безопасности:

Заголовок Referer содержит адрес предыдущей веб-страницы, с которой была получена ссылка на запрашиваемую в данный момент страницу, которая может в дальнейшем использоваться для аналитики, ведения журнала или оптимизированного кэширования.

Источник: https://developer.mozilla.org/en-US/docs/Web/Security/Referer_header:_privacy_and_security_concerns#The_referrer_problem


Решение проблем безопасности

С точки зрения заголовка Referer большинство рисков безопасности можно уменьшить, выполнив следующие шаги:

  • Referrer-Policy: Использование заголовка Referrer-Policy на вашем сервере для управления тем, какая информация отправляется через заголовок Referer. Опять же, директива no-referrer полностью опускает заголовок Referer.
  • Атрибут referrerpolicy в элементах HTML, которым грозит утечка такой информации (например, <img> и <a>). Например, это может быть установлено в no-referrer, чтобы остановить отправку заголовка Referer в целом.
  • Атрибут rel установлен на noreferrer для элементов HTML, которые могут утечь такую ​​информацию (например, <img> и <a>).
  • Техника перенаправления страницы выхода . Это единственный метод, который должен работать в данный момент без изъянов, - это иметь страницу выхода, которую вы не против иметь внутри заголовка referer. Многие сайты реализуют этот метод, в том числе Google и Facebook. Вместо того, чтобы данные реферера отображали личную информацию, он показывает только веб-сайт, с которого пришел пользователь, если он реализован правильно. Вместо данных реферера, которые отображаются как http://example.com/user/foobar, новые данные реферера будут отображаться как http://example.com/exit?url=http%3A%2F%2Fexample.com. Метод работает так, что все внешние ссылки на вашем веб-сайте переходят на промежуточную страницу, которая затем перенаправляет на последнюю страницу. Ниже у нас есть ссылка на сайт example.com, и мы URL кодируем полный URL и добавляем его к параметру url нашей страницы выхода.

Источники:


Этот вариант использования

Я выполнил ваш код с помощью комбинации GeckoDriver / Firefox и ChromeDriver / Chrome:

Кодовый блок:

driver.get('http://www.python.org')
assert 'Python' in driver.title

url = 'https://httpbin.org/headers'
driver.execute_script('window.location.href = "{}";'.format(url))
WebDriverWait(driver, 10).until(lambda driver: driver.current_url == url)
print(driver.page_source)

Замечание:

  • При использовании GeckoDriver / Firefox * заголовок 1107 * был отсутствует следующим образом:

        {
          "headers": {
            "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", 
            "Accept-Encoding": "gzip, deflate, br", 
            "Accept-Language": "en-US,en;q=0.5", 
            "Host": "httpbin.org", 
            "Upgrade-Insecure-Requests": "1", 
            "User-Agent": "Mozilla/5.0 (Windows NT 6.2; Win64; x64; rv:67.0) Gecko/20100101 Firefox/67.0"
          }
        }
    
  • При использовании ChromeDriver / Chrome Referer: "https://www.python.org/" заголовок был присутствует следующим образом:

        {
          "headers": {
            "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3", 
            "Accept-Encoding": "gzip, deflate, br", 
            "Accept-Language": "en-US,en;q=0.9", 
            "Host": "httpbin.org", 
            "Referer": "https://www.python.org/", 
            "Upgrade-Insecure-Requests": "1", 
            "User-Agent": "Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.80 Safari/537.36"
          }
        }
    

Вывод:

Кажется, что проблема с GeckoDriver / Firefox в обработке заголовка Referer.


Outro

Политика реферера

...