我正在用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
确实出现了。
答案 0 :(得分:6)
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
标头包含上一个网页的地址,从该地址开始一直指向当前请求的页面的链接,该地址可进一步用于分析,日志记录或优化的缓存。
从Referer
标头的角度来看,可以按照以下步骤缓解大多数安全风险:
Referrer-Policy
:使用服务器上的Referrer-Policy
标头来控制通过Referer标头发送的信息。再次,无引用指令将完全省略Referer标头。- HTML元素上的
referrerpolicy
属性有泄漏此类信息的危险(例如<img>
和<a>
)。例如,可以将其设置为no-referrer
以停止完全发送Referer
标头。- 在有可能泄漏此类信息(例如
rel
和noreferrer
)的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似乎是一个问题。
答案 1 :(得分:0)
上一篇文章中您有几个suggestions
如果您要检查服务器上的引荐来源网址,则可以使用代理(如其他答案所述)。
但是,如果您需要使用代理访问Java引荐来源网址,将无法正常工作。要设置Javascript引荐来源网址,我执行了以下操作:
转到推荐网站 通过Selenium API将此JavaScript注入页面上:
document.write('<script>window.location.href = "<my website>";</script>')"
还有
Python中的解决方案完全可以做到这一点: