Ajax请求:拒绝设置不安全的标头

Ajax request: Refused to set unsafe header

本文关键字:不安全 设置 请求 拒绝 Ajax      更新时间:2023-09-26

我正在尝试使用谷歌文本到语音播放音频。因此,我需要在正确设置RefererUser-Agent的情况下向他们的端点发布请求。这个调用应该返回一个我可以播放的MP3。

然而,我得到Refused to set unsafe header错误。这是我的代码。我该怎么做呢?

          $.ajax({
            url: 'http://translate.google.com/translate_tts?ie=UTF-8&q=Hello&tl=en&client=t',
            beforeSend: function(xhr) {
                 xhr.setRequestHeader("Referer", "http://translate.google.com/");
                 xhr.setRequestHeader("User-Agent", "stagefright/1.2 (Linux;Android 5.0)");
            }, success: function(data){
                el.mp3 = new Audio(data);
                el.mp3.play();
            }
          });

你不能。

规范要求浏览器中止setRequestHeader方法,如果你试图设置Referer头(它曾经是,User-Agent也被禁止,但已经改变)..

如果你需要手动设置Referer,那么你需要从你的服务器发出请求,而不是访问者的浏览器。

(也就是说,如果你需要欺骗用户代理或推荐人,那么你可能试图以一种它的所有者不希望的方式使用服务,所以你应该尊重并停止尝试)。

注意,当jQuery包装XHR时,同样的规则也适用于fetch。

OriginReferer的标头与<iframe>中的GET XMLHttpRequest清空

实际上,可能的;至少对于普通网页来说是这样。诀窍在于注入一个XMLHttpRequest函数转换为空的<iframe>。一个空的<iframe>的起源恰好是about://blank,这导致空的OriginReferer HTTP头。

HTML:

<iframe id="iframe"></iframe>
JavaScript:

const iframe    = document.getElementById('iframe');
const iframeWin = iframe.contentWindow || iframe;
const iframeDoc = iframe.contentDocument || iframeWin.document;
let script = iframeDoc.createElement('SCRIPT');
script.append(`function sendWithoutOrigin(url) {
    var request = new XMLHttpRequest();
    request.open('GET', url);
    request.onreadystatechange = function() {
        if(request.readyState === XMLHttpRequest.DONE) {
            if(request.status === 200) {
                console.log('GET succeeded.');
            }
            else {
                console.warn('GET failed.');
            }
        }
    }
    request.send();
}`);
iframeDoc.documentElement.appendChild(script);

JavaScript唤起:

var url  = 'https://api.serivce.net/';
    url += '?api_key=' + api_write_key;
    url += '&field1=' + value;
iframeWin.sendWithoutOrigin(url);

在使用第三方API服务时,具有发送空OriginReferer HTTP头的可能性对于保护隐私很重要。在某些情况下,原始域名可能会泄露敏感的个人信息;比如暗示某种身体状况。想想https://hypochondriasis-support.org:-D

通过检查.har文件中的请求来测试代码,该文件保存在Vivaldi的F12 Developer View中的Network选项卡中。

没有尝试设置User-Agent标头。

有一些头,浏览器不允许程序员在任何javascript框架(如jQuery, Angular等)或XMLHttpRequest中设置其值;同时发出AJAX请求。这些被称为禁止头:禁止头