Ajax请求:拒绝设置不安全header
Ajax request: Refused to set unsafe header
我正在尝试使用 Google Text-To-Speech 播放音频。因此,我需要 post 向他们的端点发出请求,并正确设置 Referer
和 User-Agent
。这个电话应该return一个我可以播放的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();
}
});
你不能。不可能的。
specification 要求浏览器在您尝试设置 Referer
header 时中止 setRequestHeader
方法(以前是 User-Agent
也被禁止,但已经改变了)..
如果您需要手动设置 Referer
,那么您需要从您的服务器而不是访问者的浏览器发出请求。
(也就是说,如果您需要对用户代理或引荐来源网址进行欺骗,那么您可能正在尝试以其所有者不希望的方式使用该服务,因此您应该尊重并停止尝试).
请注意,虽然 jQuery 包装了 XHR,但相同的规则适用于 fetch。
清空 Origin
和 Referer
headers with GET XMLHttpRequest
from <iframe>
嗯,实际上,是可能的;至少对于普通网页而言。
诀窍在于 injecting 和 XMLHttpRequest
函数变为空<iframe>
。
空 <iframe>
happens to be about://blank
的来源,导致空 Origin
和 Referer
HTTP headers.
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);
有可能发送空 Origin
和 Referer
HTTP headers 在使用 [=53= 时保护隐私 很重要] API 服务。在某些情况下,原始域名可能会泄露敏感的个人信息;例如暗示某种医疗状况。考虑 https://hypochondriasis-support.org :-D
通过检查 .har
文件中的请求来测试代码,该文件保存在 Vivaldi F12 开发人员视图的 Network
选项卡中。
未尝试设置 User-Agent
header。如果这也有效,请发表评论。
我正在尝试使用 Google Text-To-Speech 播放音频。因此,我需要 post 向他们的端点发出请求,并正确设置 Referer
和 User-Agent
。这个电话应该return一个我可以播放的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();
}
});
你不能。不可能的。
specification 要求浏览器在您尝试设置 Referer
header 时中止 setRequestHeader
方法(以前是 User-Agent
也被禁止,但已经改变了)..
如果您需要手动设置 Referer
,那么您需要从您的服务器而不是访问者的浏览器发出请求。
(也就是说,如果您需要对用户代理或引荐来源网址进行欺骗,那么您可能正在尝试以其所有者不希望的方式使用该服务,因此您应该尊重并停止尝试).
请注意,虽然 jQuery 包装了 XHR,但相同的规则适用于 fetch。
清空 Origin
和 Referer
headers with GET XMLHttpRequest
from <iframe>
嗯,实际上,是可能的;至少对于普通网页而言。
诀窍在于 injecting 和 XMLHttpRequest
函数变为空<iframe>
。
空 <iframe>
happens to be about://blank
的来源,导致空 Origin
和 Referer
HTTP headers.
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);
有可能发送空 Origin
和 Referer
HTTP headers 在使用 [=53= 时保护隐私 很重要] API 服务。在某些情况下,原始域名可能会泄露敏感的个人信息;例如暗示某种医疗状况。考虑 https://hypochondriasis-support.org :-D
通过检查 .har
文件中的请求来测试代码,该文件保存在 Vivaldi F12 开发人员视图的 Network
选项卡中。
未尝试设置 User-Agent
header。如果这也有效,请发表评论。