Selenium请求的HTTP标头中缺少引荐来源

时间:2019-01-09 23:01:13

标签: python selenium testing http-headers http-referer

我正在用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()

哪些印刷品:

<html><head><link rel="alternate stylesheet" type="text/css" href="resource://content-accessible/plaintext.css" title="Wrap Long Lines"></head><body><pre>{
  "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"
  }
}
</pre></body></html>

因此没有Referer。但是,如果我浏览到任何页面并手动执行

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

在Firefox控制台中,Referer 确实出现了。

2 个答案:

答案 0 :(得分:6)

根据MDN文档

Referer

  

Referer请求标头包含前一个网页的地址,从该地址开始一直指向当前请求的页面的链接。 Referer标头允许服务器识别人们从何处访问它们,并且可以将其用于例如分析,日志记录或优化的缓存。

     
    

重要提示:尽管此标头有许多无害的用法,但对于用户安全和隐私可能会产生不良后果。

  

来源:https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Referer


但是:

  

在以下情况下,浏览器不会发送Referer标头:

     
      
  • 引荐资源是本地“文件”或“数据” URI。
  •   
  • 使用了不安全的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标头发送的信息。再次,无引用指令将完全省略Referer标头。
  •   
  • HTML元素上的referrerpolicy属性有泄漏此类信息的危险(例如<img><a>)。例如,可以将其设置为no-referrer以停止完全发送Referer标头。
  •   
  • 在有可能泄漏此类信息(例如relnoreferrer)的HTML元素上,<img>属性设置为<a>
  •   
  • Exit Page Redirect技术:这是目前没有缺陷的唯一可行方法,是使您不介意在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 Referer: "https://www.python.org/"标头丢失如下:

        {
          "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"
          }
        }
    

结论:

在处理Referer标头时,GeckoDriver / Firefox似乎是一个问题。


Outro

Referrer Policy

答案 1 :(得分:0)

上一篇文章中您有几个suggestions

  

如果您要检查服务器上的引荐来源网址,则可以使用代理(如其他答案所述)。

     

但是,如果您需要使用代理访问Java引荐来源网址,将无法正常工作。要设置Javascript引荐来源网址,我执行了以下操作:

     

转到推荐网站   通过Selenium API将此JavaScript注入页面上

document.write('<script>window.location.href = "<my website>";</script>')"

还有

  

Python中的解决方案完全可以做到这一点:

     

https://github.com/j-bennet/selenium-referer