2

JavaScript を使用してブラウザの説明を取得しようとしていたところ、奇妙な結果が得られました。

productSub: 20100101 # When I open it with my Mozila FF browser
productSub: 20030107 # when I open it with PyQt4

vendorSub: # nothing in here with my Mozila FF
vendorSub: Apple Computer, Inc. # with PyQt4 ( even though I don't have anything to do with Apple)

これは HTML/JS です:

<!DOCTYPE HTML>
<html>
<head>
</head>
<body>
<p id="myp">Hi</p>

<script>
    body = document.getElementsByTagName('body')[0];
    var nav_div = document.createElement('div');
    nav_div.id = 'nav_div';
    for (para in navigator) {
        var para_p = document.createElement('p');
        var context = document.createTextNode(para + ': ' + navigator[para]);
        para_p.appendChild(context);
        para_p.id = para;
        nav_div.appendChild(para_p);
    }
    body.appendChild(nav_div);
</script>
</body>
</html>

Python/PyQt4 コードは次のとおりです。

#! /usr/bin/env python2.7

from PyQt4.QtCore import *
from PyQt4.QtGui import *
from PyQt4.QtWebKit import *
import sys, signal


class MySettings(QWebPage):
    def userAgentForUrl(self, url):
        return 'Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:17.0) Gecko/20100101 Firefox/17.0'

class Opener(QWebView):
    def __init__(self):
        QWebView.__init__(self)
        url = QUrl('/home/john-the-ripper/JavaScript/w.html')
        self.setPage(MySettings())
        self.load(url)
        self.show()

if __name__ == '__main__':
    app = QApplication(sys.argv)
    opener = Opener()
    # press Ctrl + C for exit
    if signal.signal(signal.SIGINT, signal.SIG_DFL):
        sys.exit(app.exec_())
    app.exec_()

ご覧のとおり、マシンと同じようにユーザー エージェントを定義しました。

userAgent: Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:17.0) Gecko/20100101 Firefox/17.0

PyQt4 の結果は次のとおりです。

PyQt4

そして、これが私のネイティブ ブラウザ Mozilla Fire Fox の結果です。

FF

質問は次のとおりです。

  1. で定義したのに、なぜproductSub異なるように見えるのかuserAgentForUrl()
  2. このページを PyQt4 で開くとvendorSubApple Computer, Inc.
4

2 に答える 2

3

考えられる回避策は、navigatorオブジェクトを再定義することです。まず、javaScriptWindowObjectClearedシグナルをページのメイン フレームからスロットに接続します。

connect(myPage->mainFrame(), SIGNAL(javaScriptWindowObjectCleared()),
  this, SLOT(tweakNavigatorObject()));

スロットで、オブジェクトを完全に再定義できるスクリプト ( QWebFrame::evaluateJavaScript ) を実行します。

window.navigator = {
  appCodeName: 'Mozilla',
  appName: 'Netscape',
  vendor: 'My Company'
}

JFYI、これはページのスクリプトが実行される前にグローバル オブジェクトを操作する機能を提供するために PhantomJS で使用したトリックです。たとえば、Math.random の動作を操作したり、ユーザー エージェント スニッフィングを検出したりするのに役立ちます。

于 2012-12-30T17:05:47.433 に答える
1

オブジェクト内の情報はヘッダーnavigatorのみに基づいていると誰が言いますか?UserAgentこのヘッダーは、URLを取得するときにサーバーに送信されることのみを目的としています。はい、オブジェクトの一部のnavigatorは現在のヘッダーから取得されますが、ご存知のように、すべてがそうであるわけではなく、意図されているわけでもありません。

実際、appVersionuserAgent文字列のみがそのヘッダーから取得され、他のすべては代わりにネイティブブラウザを反映します。

QtブラウザはAppleプロジェクトであるWebKitに基づいているため、ベンダー文字列です。navigatorSafariでリフレクションコードを実行すると、次のことがわかります。

geolocation: [object Geolocation]
cookieEnabled: true
language: en-us
productSub: 20030107
product: Gecko
appCodeName: Mozilla
mimeTypes: [object MimeTypeArray]
vendorSub:
vendor: Apple Computer, Inc.
platform: MacIntel
appName: Netscape
appVersion: 5.0 (Macintosh; Intel Mac OS X 10_7_5) AppleWebKit/536.26.17 (KHTML, like Gecko) Version/6.0.2 Safari/536.26.17
userAgent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_5) AppleWebKit/536.26.17 (KHTML, like Gecko) Version/6.0.2 Safari/536.26.17
plugins: [object PluginArray]
onLine: true
javaEnabled: function javaEnabled() { [native code] }
getStorageUpdates: function getStorageUpdates() { [native code] }

Safariでは、メニューUserAgentからヘッダーも切り替えましょう。Developer切り替えると、と文字列も変更されます。たとえば、に切り替えると、これら2つの変数だけが次のように変更されます。appVersionuserAgentFirefox 11.0 — Mac

appVersion: 5.0 (Macintosh; Intel Mac OS X 10.7; rv:11.0) Gecko/20100101 Firefox/11.0
userAgent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.7; rv:11.0) Gecko/20100101 Firefox/11.0

WebKitに基づく別のブラウザはChromeであり、そのnavigator情報は非常に似ています。

geolocation: [object Geolocation]
onLine: true
cookieEnabled: true
vendorSub:
vendor: Google Inc.
productSub: 20030107
product: Gecko
mimeTypes: [object MimeTypeArray]
plugins: [object PluginArray]
platform: MacIntel
userAgent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_5) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.101 Safari/537.11
language: en-US
appVersion: 5.0 (Macintosh; Intel Mac OS X 10_7_5) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.101 Safari/537.11
appName: Netscape
appCodeName: Mozilla
doNotTrack: null
javaEnabled: function javaEnabled() { [native code] }
getStorageUpdates: function getStorageUpdates() { [native code] }
webkitStartActivity: function webkitStartActivity() { [native code] }
于 2012-12-29T22:27:29.927 に答える