我如何才能愚弄一个查看JavaScript对象的站点';导航器&x27;看到我';我不在Windows上?

我如何才能愚弄一个查看JavaScript对象的站点';导航器&x27;看到我';我不在Windows上?,javascript,browser,user-agent,Javascript,Browser,User Agent,我试图浏览一个网站,但是,它只能在Windows和Mac下运行,因为他们使用JavaScript中的navigator.platform来查找我运行的架构。当然,他们也使用浏览器的用户代理,但这很容易被欺骗 下面是有问题的.js:。负责浏览器检测的代码位于顶部。有没有办法在网站运行之前更改.js文件,或者类似的东西,这样我就可以取消检查 使用JavaScript控制台可以产生: >navigator.platform Linux i686 显然,我更改了浏览器的用户代理,但是navigator.

我试图浏览一个网站,但是,它只能在Windows和Mac下运行,因为他们使用JavaScript中的
navigator.platform
来查找我运行的架构。当然,他们也使用浏览器的用户代理,但这很容易被欺骗

下面是有问题的.js:。负责浏览器检测的代码位于顶部。有没有办法在网站运行之前更改.js文件,或者类似的东西,这样我就可以取消检查

使用JavaScript控制台可以产生:

>navigator.platform

Linux i686

显然,我更改了浏览器的用户代理,但是
navigator.platform
似乎没有从用户代理获取它的值

也许有人知道如何更改由
navigator.platform
返回的值,因为我讨厌在VirtualBox下运行Windows来使用此站点

编辑:
这可能令人感兴趣,因为Linux用户可能会被人为拒绝访问网站,对此无能为力。

尝试在Firefox中更改此属性(随时)会产生以下结果:

错误:设置只有getter的属性

源文件:index.html

行:1

所以我想你会很难过的


我想尝试一下如何获得修复。

对于基于Mozilla的浏览器,演示了如何进行修复。此代码可以从脚本中注入。

因为您不能直接设置
导航器。平台
,所以您将不得不偷偷摸摸-创建一个行为类似于
导航器
的对象,替换其
平台
,然后将
导航器
设置为它

var fake_navigator = {};

for (var i in navigator) {
  fake_navigator[i] =  navigator[i];
}

fake_navigator.platform = 'MyOS';

navigator = fake_navigator;
如果在加载文档之前执行此代码(使用GreaseMonkey、插件或Chrome扩展),则页面将看到
navigator.platform
作为
“MyOS”


注意:仅在Chrome中测试。

关于:config->general.platform.override

如果您使用的浏览器支持Object.defineProperty()(很可能支持),则实现相同目标的更现代方法如下:

var fakePlatformGetter = function () {
  return "your fake platform";
};
if (Object.defineProperty) {
  Object.defineProperty(navigator, "platform", {
    get: fakePlatformGetter
  });
  Object.defineProperty(Navigator.prototype, "platform", {
    get: fakePlatformGetter
  });
} else if (Object.prototype.__defineGetter__) {
  navigator.__defineGetter__("platform", fakePlatformGetter);
  Navigator.prototype.__defineGetter__("platform", fakePlatformGetter);
}
Object.defineProperty(导航器,“平台”{
值:“我的自定义值”,
可配置:true//需要多次更改值
});

这允许您将其设置为任何自定义值,还允许您在不重新加载页面的情况下更改任意次数。

您使用什么浏览器?我使用Chrome和Firefox。两者都不是从用户代理获取平台信息,而是从其他地方获取平台信息。可能是内置的。我会使用Linux下任何可以提供伪造的
导航器的浏览器。平台
Radu:除IE外,所有平台上的所有浏览器都支持
\uuuu defineGetter\uuu
。这就是你要找的。它在这里旋转。这看起来很有希望,我来试试。非常感谢。是的,这是鬼鬼祟祟的:)谢谢你的帮助!实际上,您可以替换平台getter。没有平台设置器,因此
navigator.platform=…
除了Chrome在所有对象上支持非标准的
\uuuu defineGetter\uuu
方法外,什么都不做。Firefox的Pre-Alpha也支持ECMAScript 5的
对象。defineProperty
。我可能有偏见(因为这是我的答案),但我更喜欢定义getter。但这也行得通,如果getter方法不存在的话,我也会这么想。这已经不起作用了。页面没有看到它。我使用了另一种方法:navigator;但这也不起作用。任何帮助,请感谢!我想我会从2010年开始安装较旧的Chrome。。但是有一个小小的问题,那就是从哪里得到tampermonkey:)这在Firefox24中已经不存在了。哪个版本允许这样做?