2

我需要将一些 JavaScript 注入现有的应用程序。

该应用程序通常嵌入iframe这样的:

<html>
<body>
    <iframe src="http://webchat.quakenet.org/" width="647" height="400"></iframe>
</body>
</html>

它是一个基于 JavaScript 的开源 IRC 客户端http://webchat.quakenet.org/来源)。

现在我喜欢注入一些 JS 来突出显示特殊消息,例如。为此,我已经找到要覆盖的HilighterClass

问题是,我怎么能这样做?iFrame我猜现代浏览器不“允许”将 JS 注入到 an中,或者?

如果这iFrame是一个问题,也许我可以像他们一样添加客户端:

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
  <base />
  <title>QuakeNet Web IRC (qwebirc)</title>
 ...
  <script type="text/javascript">
    var ui = new qwebirc.ui.Interface("ircui", qwebirc.ui.QUI, {"appTitle":"QuakeNet Web     IRC","dynamicBaseURL":"/dynamic/leibniz/","baseURL":"http://webchat.quakenet.org/","validateNickname":false,"networkServices":["Q!TheQBot@CServe.quakenet.org"],"nickValidation":    {"maxLen":15,"validSubChars":"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_[]{}`^\\|0123456789-","validFirstChar":"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_[]{}`^\\|","minLen":2},"staticBaseURL":"/static/leibniz/","loginRegex":"^You are now logged in as [^ ]+\\.$","networkName":"QuakeNet"});
  </script>
</head>
<body>
  <div id="ircui">
    <noscript>
      <div id="noscript">Javascript is required to use IRC.</div>
    </noscript>
  </div>
</body>
</html>

要求:

  • 客户端应该连接到 quakenet.org 服务器。由于某些跨站点脚本限制,这可能是一个问题。
  • 如果我的用户不需要其他插件,那最好。
4

3 回答 3

2

您可以使用像Privoxy这样的代理服务器,它可以将 JavaScript 注入页面。不幸的是,您的用户必须通过 Privoxy 进行所有浏览,因此这可能不是一个选择。

或者您设置自己的反向代理(例如 Squid)并在中继之前更改内容。您可以通过调用您自己的库来替换对 JavaScript 库的请求,该库包含原始 JavaScript突出显示代码。

Ans 你肯定听说过Greasemonkey,这是一个浏览器插件,可以做到这一点 - 注入内容。

于 2012-10-16T13:02:02.600 回答
1

您不能操纵 iframe 的内容。跨站点脚本不是这里的问题。

于 2012-10-16T12:55:33.357 回答
0

为了使注入最简单,您可以使用Gatejs SPDY/HTTP 代理并使用注入 gatejs 操作码- 它适用于正向和反向代理。

Gatejs 注入将尝试将您的 html 代码添加到 HTML (text/html) 类型的内容中。

下面是一个使用注入的正向代理示例。

var serverConfig = function(bs) { return({
    hostname: "testServer0",
    runDir: "/tmp/gatejs",
    dataDir: "/path/to/dataDir",
    logDir: "/var/log/gatejs",

    http: {
        testInterface: {
            type: 'forward',
            port: 8080,
            pipeline: 'pipetest'
        },
    },
    pipeline: {
        pipetest: [
            ['injection', {
                 code: "<h1>w00t injection</h1>"
            }],
            ['proxyPass', { mode: 'host', timeout: 10 }]
        ],
    }
})};

MK-

于 2015-07-12T09:47:42.760 回答