22

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

这是有问题的 .js:http: //pastebin.com/f56fd608d。负责浏览器检测的代码位于顶部。有没有办法在网站运行之前更改 .js 文件,或者类似的东西,所以我可以消除检查?

使用 JavaScript 控制台产生:

>navigator.platform
Linux i686

显然我改变了浏览器的用户代理,但navigator.platform似乎并没有从用户代理中获得它的价值。

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

编辑:这可能很有趣,因为 Linux 用户可能会被人为地拒绝访问网站,并且对此无能为力。

4

6 回答 6

20
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);
}
于 2010-01-30T03:09:33.603 回答
16

由于您不能直接设置navigator.platform,因此您必须偷偷摸摸-创建一个行为类似于 的对象navigator,替换它platform,然后设置navigator为它。

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 中测试。

于 2010-01-30T02:24:22.880 回答
6

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

Object.defineProperty(navigator, 'platform', {
  value: 'my custom value',
  configurable: true // necessary to change value more than once
});

这允许您将其设置为您想要的任何自定义值,并且还允许您根据需要多次更改它,而无需重新加载页面。

于 2016-08-16T22:25:24.257 回答
5

about:config -> general.platform.override

于 2010-03-16T22:04:54.267 回答
3

对于基于 Mozilla 的浏览器,GreaseSpot / Code Snippets # Hijacking browser properties演示了它是如何完成的。此代码可以从GreaseMonkey脚本中注入。

于 2010-01-30T02:18:56.043 回答
-1

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

错误:设置只有 getter 的属性

源文件:index.html

线路:1

所以我认为你会很难过。

我会尝试联系作者以获得修复。

于 2010-01-30T02:16:28.360 回答