我正在寫一個隱私擴展,它需要我欺騙瀏覽器的用戶代理屬性,也就是navigator.userAgent(是的,我已經知道User-Agent HTTP頭並且已經處理了該問題) 。瀏覽器仍然泄漏真正的用戶代理
我的問題是,一個頁面可能不僅僅有一個主框架,而且還有一個關於iframe的變量。在我的清單文件中,我使用了all_frames:true將我的內容腳本注入到所有框架和match_about_blank:true以注入具有「about:blank」url的框架。
我使用BrowserLeaks來測試我的擴展它似乎使用窗口選項正確地欺騙用戶代理,但是當使用iframe.contentWindow方法時,它顯示真正的用戶代理。
我認爲這可能是因爲iframe是沙箱,你不允許注入到沙盒iframes。這將是一個巨大的問題,因爲網站可以逃避擴展,並拒絕他們訪問沙盒iframe。
這是我得到的鉻錯誤:
阻止腳本執行在「關於:空白」,因爲文檔的幀是沙箱和「允許的腳本」權限未設置。
match_about_blank:
可選。是否將內容腳本插入about:blank和about:srcdoc。只有當內容腳本的繼承URL與匹配字段中的一種已聲明模式相匹配時,內容腳本纔會被注入頁面。繼承URL是創建框架或窗口的文檔的URL。 內容腳本不能插入沙盒框中。 默認爲false。
或者腳本運行在所有包括沙盒的iframe中,但腳本運行速度不夠快,即run_at:document_start。
從MDN
match_about_blank:
match_about_blank是在Firefox從版本52.注意支持在Firefox中,內容腳本將無法在「document_start」注入到空的I幀,即使你指定值在run_at。
我的標題說鉻擴展,但它也將是Firefox的。我發佈了來自MDN和Chrome的文檔,因爲他們的措辭不同。在Chrome上,當我測試這個說github.com時,我得到關於在iframe上的沙盒上的錯誤,但在Firefox上我沒有得到這樣的錯誤,但它仍然不會像我想要的那樣欺騙iframe中的屬性。有任何想法嗎?
的manifest.json
{
"name": "Shape Shifter",
"version": "0.0.1",
"description": "Anti browser fingerprinting web extension. Generates randomised values for HTTP request headers and javascript API's.",
"manifest_version": 2,
"icons": {
"16": "icons/crossed_eye_16x16.png",
"32": "icons/crossed_eye_32x32.png",
"48": "icons/crossed_eye_48x48.png",
"128": "icons/crossed_eye_128x128.png"
},
"background": {
"persistent": true,
"scripts": ["js/background.js"]
},
"browser_action": {
"default_title": "Shape Shifter",
"default_icon": {
"16": "icons/crossed_eye_16x16.png",
"32": "icons/crossed_eye_32x32.png"
},
"default_popup": "html/popup.html"
},
"content_scripts": [
{
"all_frames": true,
"match_about_blank": true,
"run_at": "document_end",
"matches": ["<all_urls>"],
"js": ["js/inject.js"]
}
],
"permissions": [
"webRequest",
"webRequestBlocking",
"<all_urls>"
],
"web_accessible_resources": [
"js/lib/seedrandom.min.js",
"js/random.js",
"js/api/document.js",
"js/api/navigator.js",
"js/api/canvas.js",
"js/api/history.js",
"js/api/battery.js",
"js/api/audio.js",
"js/api/element.js"
]
}
inject.js(我的內容腳本)
console.log("Content Script Running ...");
function inject(filePath, seed) {
// Dynamically create a script
var script = document.createElement('script');
// Give the script a seed value to use for spoofing
script.setAttribute("data-seed", seed);
// Give the script a url to the javascript code to run
script.src = chrome.extension.getURL(filePath);
// Listen for the script loading event
script.onload = function() {
// Remove the script from the page so the page scripts don't see it
this.remove();
};
// Add the script tag to the DOM
(document.head || document.documentElement).appendChild(script);
}
function getSeed(origin) {
// Get a Storage object
var storage = window.sessionStorage;
// Try to get a seed from sessionStorage
var seed = storage.getItem(origin);
// Do we already have a seed in storage for this origin or not?
if (seed === null) {
// Initialise a 32 byte buffer
seed = new Uint8Array(32);
// Fill it with cryptographically random values
window.crypto.getRandomValues(seed);
// Save it to storage
storage.setItem(origin, seed);
}
return seed;
}
var seed = getSeed(window.location.hostname);
inject("js/lib/seedrandom.min.js", seed);
console.log("[INFO] Injected Seed Random ...");
inject("js/random.js", seed);
console.log("[INFO] Injected Random ...");
inject("js/api/document.js", seed);
console.log("[INFO] Injected Document API ...");
inject("js/api/navigator.js", seed);
console.log("[INFO] Injected Navigator API ...");
inject("js/api/canvas.js", seed);
console.log("[INFO] Injected Canvas API ...");
inject("js/api/history.js", seed);
console.log("[INFO] Injected History API ...");
inject("js/api/battery.js", seed);
console.log("[INFO] Injected Battery API ...");
inject("js/api/audio.js", seed);
console.log("[INFO] Injected Audio API ...");
inject("js/api/element.js", seed);
console.log("[INFO] Injected Element API ...");
當你欺騙一個頁面對象,你運行一個腳本頁面,而不是內容腳本,這是爲什麼iframe的沙箱限制適用。我認爲你無能爲力。 – wOxxOm
@ wOxxOm這真的很不幸。因此,如果一個頁面想要獲得用戶代理的實際價值,他們只需製作一個沙盒的iframe,然後我的擴展就無法做到這一點?這使我的擴展毫無意義。有沒有辦法解決這個問題?以前使用舊版Firefox插件時,只需設置userAgent首選項值,但使用新的Web擴展名則無法再執行此操作。我想通過網絡擴展來製作隱私擴展將成爲一場噩夢。 – Snapper26
請編輯題目:包括複製問題的[mcve]。對於Chrome擴展程序或Firefox WebExtensions,這通常意味着包含您的* manifest.json *以及一些背景,內容和/或彈出式腳本/ HTML。尋求調試幫助的問題(「爲什麼代碼不按我想要的方式工作?」)必須包括:(1)期望的行爲,(2)特定問題或錯誤,以及(3)重現它所需的最短代碼*在問題本身*。另請參閱:[我可以在這裏詢問什麼主題?](http://stackoverflow.com/help/on-topic)和[問]。 – Makyen