我为伪造User-Agent字符串编写了一个chrome扩展名。替换标题已完成,但我在JavaScript中伪造用户代理字符串时遇到了麻烦。
如我们所知,为了在客户端检测用户代理,我们可以阅读navigator.userAgent
和window.navigator.userAgent
,并且要禁用它,我在 content_scripts 中使用此代码:< / p>
var new_ua = 'Hell Yeah!';
if (typeof new_ua === 'string' && new_ua !== '') {
var d = document.documentElement,
injection_code = '(' + function(useragent) {
if (typeof window === 'object' && typeof window.navigator === 'object') {
navigator = Object.create(window.navigator);
Object.defineProperties(navigator, {
userAgent: {get: function() {return useragent;}},
appVersion: {get: function() {return useragent;}}
});
Object.defineProperty(window, 'navigator', {
value: navigator, configurable: false, enumerable: false, writable: false
});
}
} + ')("' + new_ua.replace(/([\"\'])/g, '\\$1') + '");';
d.setAttribute('onreset', injection_code);
d.dispatchEvent(new CustomEvent('reset'));
d.removeAttribute('onreset');
Object.defineProperties(navigator, {
userAgent: {get: function() {return new_ua;}},
appVersion: {get: function() {return new_ua;}}
});
}
manifest.json
:
"content_scripts": [{
"all_frames": true,
"js": ["/js/inject/content.js"],
"matches": ["*://*/*"],
"run_at": "document_start"
}],
"minimum_chrome_version": "49.0",
"permissions": [
"webRequest", "webRequestBlocking", "*://*/*", "storage", "tabs"
]
一切正常:
测试页面代码:
<html>
<body>
headers = <?php echo $_SERVER['HTTP_USER_AGENT']; ?><br />
<script>
document.write('navigator.userAgent = ' + navigator.userAgent + '<br />');
document.write('window.navigator.userAgent = ' + window.navigator.userAgent + '<br />');
</script>
<iframe style="display: none"></iframe>
</body>
</html>
要从扩展程序设置获取伪造的用户代理,我们可以使用chrome.runtime.sendMessage
方法,是的。但是如果我们使用:
chrome.runtime.sendMessage({action: 'useragent.get'}, function(new_ua){
// code from first snippet is here
});
假装不起作用!为什么?因为我们在页面 onLoad 事件后执行代码。因此,我们必须在没有chrome.runtime.sendMessage
和任何其他异步方法的情况下从后台脚本获取实际的用户代理。
但是怎么样?
抱歉我的英文
答案 0 :(得分:1)
消息在Javascript引擎的下一个事件任务中传递,而您的小而简单的页面完全在活动事件任务中进行解析。
可能的解决方法:
localStorage
:您的扩展程序会在首次访问该页面时设置一个值,然后您的内容脚本就能及时阅读。当然这是不可靠的,有些人设置他们的浏览器在浏览器重启后清除localStorage。