views:

287

answers:

5

I am trying to a website, however, it only works under Windows and Mac because they use the use navigator.platform from JavaScript to find out the architecture I run on. Of course, they also use the browser's user agent, but that was easy to spoof.

Here is the .js in question: http://pastebin.com/f56fd608d. The code responsible for browser detection is at the top. Is there any way of changing the .js file before the site runs, or something similar, so I can eliminate the check?

Using the JavaScript console yields:

>navigator.platform
Linux i686

Evidently I changed the browser's user agent, but navigator.platform does not seem to take it's value from the user agent.

Maybe someone knows how to change the value returned by navigator.platform, because I hate running Windows under VirtualBox to use this site.

EDIT: This could be of interest because Linux users might be artificially denied access to websites, and can do nothing about it.

A: 

Attempting to change this property (at any time) in Firefox yields:

Error: setting a property that has only a getter

Source File: index.html

Line: 1

So I think you will have a hard time.

I'd try to contact the author about obtaining a fix.

scunliffe
+3  A: 

For a Mozilla-based browser, GreaseSpot / Code Snippets # Hijacking browser properties demonstrates how it may be done. This code may be injected from a GreaseMonkey script.

ephemient
This looks promising, I'll try it. Thank you!
Radu
+3  A: 

Since you can't directly set navigator.platform, you will have to be sneaky - create an object that behaves like navigator, replace its platform, then set navigator to it.

var fake_navigator = {};

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

fake_navigator.platform = 'MyOS';

navigator = fake_navigator;

If you execute this code before the document loads (using GreaseMonkey, an addon or a Chrome extension), then the page will see navigator.platform as "MyOS".

Note: tested only in Chrome.

Max Shawabkeh
Yes, this is sneaky :)Thank you for the help!
Radu
Actually, you can replace the platform getter. There is no platform setter so `navigator.platform = ...` doesn't do anything but Chrome supports the non-standard `__defineGetter__` method on all objects. Pre-alphas of Firefox support ECMAScript5's `Object.defineProperty` too.
Eli Grey
I may be biased (because it's my answer) but I like defining a getter more, too. But this works too, and it's what I would have thought of if the getter approach didn't exist.
ephemient
+2  A: 
var fakePlatformGetter = function () {
  return "your fake platform";
};
if (Object.defineProperty) {
  Object.defineProperty(navigator, "platform", {
    get: fakePlatformGetter
  });
} else if (Object.prototype.__defineGetter__) {
  navigator.__defineGetter__("platform", fakePlatformGetter);
}
Eli Grey
+1  A: 

about:config - > general.platform.override

Mister_Anonymous