2010-01-30 27 views
16

Tôi đang cố gắng duyệt một trang web, tuy nhiên, nó chỉ hoạt động trong Windows và Mac vì chúng sử dụng navigator.platform từ JavaScript để tìm hiểu kiến ​​trúc mà tôi đang chạy. Tất nhiên, họ cũng sử dụng tác nhân người dùng của trình duyệt, nhưng điều đó dễ bị giả mạo.Tôi làm cách nào để đánh lừa một trang web xem xét điều hướng của đối tượng JavaScript '' để thấy rằng tôi không có trên Windows?

Đây là các câu hỏi được đề cập đến: http://pastebin.com/f56fd608d. Mã chịu trách nhiệm phát hiện trình duyệt ở trên cùng. Có cách nào để thay đổi tệp .js trước khi trang web chạy hay điều gì đó tương tự, vì vậy tôi có thể loại bỏ kiểm tra không?

Sử dụng giao diện điều khiển sản lượng JavaScript:

>navigator.platform
Linux i686

Rõ ràng tôi đã thay đổi user agent của trình duyệt, nhưng navigator.platform dường như không mất giá trị của nó từ các đại lý người dùng.

Có thể ai đó biết cách thay đổi giá trị trả về navigator.platform, vì tôi ghét chạy Windows trong VirtualBox để sử dụng trang web này.

EDIT: Điều này có thể được quan tâm vì người dùng Linux có thể bị từ chối giả mạo quyền truy cập vào trang web và không thể làm gì về điều đó.

+0

bạn sử dụng trình duyệt nào? –

+0

Tôi sử dụng Chrome và Firefox.Cả hai đều lấy thông tin nền tảng không phải từ User Agent, nhưng từ một nơi khác. Có lẽ nó được tích hợp sẵn. Tôi sẽ sử dụng bất kỳ trình duyệt nào dưới Linux có thể cung cấp một "navigator.platform' giả mạo – Radu

+1

Radu: Tất cả các trình duyệt ngoại trừ IE trên tất cả các nền tảng đều hỗ trợ' __defineGetter__'. Đây là những gì bạn đang tìm kiếm. –

Trả lời

14

Vì bạn không thể đặt trực tiếp navigator.platform, bạn sẽ phải lén lút - tạo đối tượng hoạt động như navigator, thay thế platform, sau đó đặt navigator cho nó.

var fake_navigator = {}; 

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

fake_navigator.platform = 'MyOS'; 

navigator = fake_navigator; 

Nếu bạn thực thi mã này trước khi tải tài liệu (sử dụng GreaseMonkey, một addon hoặc một phần mở rộng của Chrome), sau đó trang web sẽ thấy navigator.platform như "MyOS".

Lưu ý: chỉ được thử nghiệm trong Chrome.

+0

Có, điều này là lén lút :) Cảm ơn sự giúp đỡ của bạn! – Radu

+4

Thực ra, bạn có thể thay thế nền tảng getter. Không có nền tảng setter để 'navigator.platform = ...' không làm bất cứ điều gì nhưng Chrome hỗ trợ phương thức '__defineGetter__' không chuẩn trên tất cả các đối tượng. Pre-alphas của Firefox cũng hỗ trợ 'Object.defineProperty' của ECMAScript5. –

+0

Tôi có thể bị thiên vị (vì đó là câu trả lời của tôi) nhưng tôi cũng muốn xác định thêm một bộ thu hút nữa. Nhưng điều này cũng hoạt động, và đó là những gì tôi đã nghĩ đến nếu cách tiếp cận getter không tồn tại. – ephemient

-1

Cố gắng để thay đổi thuộc tính này (bất cứ lúc nào) trong sản lượng Firefox:

Error: setting a property that has only a getter

Source File: index.html

Line: 1

Vì vậy, tôi nghĩ rằng bạn sẽ có một thời gian khó khăn.

Tôi muốn thử contact the author để nhận được bản sửa lỗi.

17
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); 
} 
+0

đó là một cách hay để giải quyết sự cố – navee

4

about: config -> general.platform.override

+0

điều này không còn tồn tại trong Firefox 24 nữa. Phiên bản nào đã cho phép điều này? – Skuta

1

Với điều kiện là trình duyệt bạn đang sử dụng hỗ trợ Object.defineProperty() (nó có khả năng thực hiện), một cách hiện đại hơn để đạt được cùng một mục tiêu như sau:

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

này cho phép bạn đặt nó vào bất kỳ giá trị tùy chỉnh mà bạn muốn, và nó cũng cho phép bạn thay đổi nó nhiều lần như bạn muốn mà không cần phải tải lại trang.

Các vấn đề liên quan