问题复现
项目中需要加载第三方平台服务器上的图片,出现HTTP请求403的情况。起初以为是因为referrerpolicy设置no-referrer导致。后续发现,原因是图片的服务器使用了安全服务,必须浏览器先访问了该图片连接,有该域名的Cookie才可以通过HTTP请求进行加载。
referrerpolicy属性规定用户发送请求时需要发送哪些引荐信息
属性
no-referrer:
完全不发送referrer信息,不告知服务器请求的来源 意味着服务器端不会知道请求是从哪个页面发起的
(假设在www.google.com 里有一个www.baidu.com 链接,那么点击这个www.baidu.com ,它的header 信息里就有:Referer=www.google.com )
no-referrer-when-downgrade:
默认值,当从 HTTPS 页面向 HTTP 页面发送请求时不发送 referrer,否则发送 referrer。
origin:
仅发送页面源信息,不包含路径信息和查询参数。
origin-when-cross-origin:
请求源(origin)和目标源(origin)相同时,将包含完整的 URL 信息。 请求源和目标源不同源时,仅包含请求源的 origin源信息,不包含路径或查询参数等详细信息。
same-origin:
仅发送同域的 referrer,其它情况不发送 referrer。 "same-origin"指的是在请求中包含Referer头部,但只在请求和当前页面的源相同时才会发送Referer头部信息。同源策略限制了资源的来源只能是相同源的页面或者同域下的页面,这也就保证了请求不会被跨站点所篡改。
"no-referrer"和"same-origin"的区别在于是否发送Referer头部信息以及是否限制了其来源。"no-referrer"适用于需要保护数据隐私的场景,而"same-origin"适用于限制资源访问来源的场景。
strict-origin-when-cross-origin:
跨源请求时,仅发送目标站点域名部分与本站域名完全一致的请求,同源请求仍然发送全部 referrer 同域名https发送http 也属于跨域请求
unsafe-ur:
发送全部的 referrer,不管请求目标是不是 HTTPS
图片防盗链
一般的防盗链方式
1、通过检查发送http请求的referrer头,判断请求是否为指定域名或者IP(可信域白名单)
2、访问图片时,动态生成图片在服务器中,只能用于访问一次。
3、检查HTTP请求中的User-Agent 信息:通过检查 HTTP 请求中的 User-Agent 字段,判断该请求是否为浏览器发送的请求,从而控制图片的访问权限。
假设图片设置了防盗链,设置了no-referrer的img标签请求图片时referrer为空值或者不可靠值,所以会出现403情况。
no-referrer失效
一般来说,现代主流浏览器都支持使用 "no-referrer" 的形式发出 HTTP 请求,但是不同浏览器的支持程度可能会有所不同。以下是一些可能不支持 "no-referrer" 的浏览器:
1. Internet Explorer:低版本 IE 浏览器可能不支持使用 "no-referrer" 的形式发出 HTTP 请求。
2. Safari:Safari 浏览器某些版本对 "no-referrer" 的支持不完整。
3. UC Browser、360 浏览器等国内浏览器:可能存在不支持 "no-referrer" 的情况。
如果需要在特定浏览器中使用 "no-referrer" 的形式发出 HTTP 请求,可能需要进行兼容性处理,例如使用 JavaScript 等方式控制请求头,实现类似的效果。