7

通过嵌入以下 SWF 代码,当在单个页面中运行时,新标签会出现所需的 URL 和顶部的广告栏。不需要用户交互。

<embed width="1" height="1" align="middle"
       pluginspage="http://www.macromedia.com/go/getflashplayer"
       type="application/x-shockwave-flash" allowscriptaccess="sameDomain"
       name="blog" bgcolor="000000" wmode="transparent" quality="high"
       src="http://i1177.photobucket.com/albums/x348/hosting504/red.swf" 
       flashvars="web=www.agitehabbero.com/index.php&creador=supercito">

如果代码嵌入到框架中,则不会创建新选项卡,而是修改框架以添加 html 页面。

编辑:页面上没有 JAVASCRIPT。

SWF 文件如何做到这一点?(将内容注入网页)?

4

7 回答 7

6

此 ActionScript3.0 代码将注入一个匿名函数,然后在传递单个参数“hello”时执行它:( ExternalInterface.call("function(msg){ alert(msg); }", "hello");这将像下面的 Javascript 代码一样执行:)function(msg){ alert(msg); }("hello");

由于您可以注入代码,因此您可以编写代码来操作文档(添加元素、修改样式、更改元素值等)。例如这个 AS3 代码:ExternalInterface.call("function(){ document.write(\"Hello, world!\"); }");将显示“Hello, world!” 在 HTML 页面上。

此外,来自文档

  • 在包含 HTML 页面的 SWF 文件的对象标记中,设置以下参数: <param name="allowScriptAccess" value="always" />
  • 在 SWF 文件中,添加以下 ActionScript: flash.system.Security.allowDomain(sourceDomain)

我测试了以上所有内容,它在我的浏览器上运行良好:Google Chrome 19、Internet Explorer 8、Firefox 12。

根据您的要求,文档方面没有 javascript :)

于 2012-06-05T18:29:44.160 回答
3

知道了!
正如你所说,没有Javascript。
偷偷摸摸的代码,我不完全理解为什么,但设法让它工作。下载并反编译red.swf,有2帧,只有第二帧有以下代码(评论是我的)

    /*

flashvars are loaded to the _root as following:
_root.web = www.agitehabbero.com/index.php&creador=supercito
oddly the amperesand (&) gets interpreted too so we also get.
_root.creador=supercito

*/
    stop();
    var url = _root.web;
    if ("supercito" == _root.creador) {//verifies that the url passed has a value pair creador=supercito I guess to avoid it being used for something else?
        getURL ("http://supercito.com.ar/g3/web.php?url=" + url, "glu");
        /* the getURL calls this site, in a new window (frames are treated as windows by browsers) 
        somehow flash , as it doesn't find the frame or window, converts it into a pop up */
    } else {
        getURL ("http://supercito.com.ar/404", "glu");
    }

哦,这几乎不是 ActionScript 2,看起来像 AS1(它使用相同的 VM)。

为了进一步测试,我简化了 flash 代码并上传到服务器:

stop();
getURL ("http://supercito.com.ar/g3/web.php?url=" + _root.web, _root.marco);

现在在服务器中,我们可以玩不同的输入,看看会发生什么。链接是: http: //m0.cl/t/dwit/assets/no-usr/testing-odd.php

(对不起,我在其他事情中间的凌乱地址)
如果我们为框架参数使用任何值,http://supercito.com.ar 页面将加载并使窗口成为弹出窗口,除非我们使用 _self。
问题是我看不到这个新窗口变成弹出窗口的部分,也许它隐藏在它加载的 jquery 文件中。打败我。甚至与查尔斯核对过。如果有人有想法,请告诉我,我会尝试。
希望这可以帮助。
这是我第一次发帖 :)

编辑:
我上传了一个修改以进行更好的测试。
现在我们也可以更改主 URL。

stop();
getURL (_root.main + _root.web, _root.marco);


编辑 Nº2
这是闪光!
使用新设置,您可以尝试任何 URL,只要目标窗口不是 _self 或 _top,它就会使其成为弹出窗口,事实是,Chrome 将其解释为弹出窗口,但 IE 只是读取它作为 _blank 窗口。
对我来说似乎是一个错误。

于 2012-06-08T02:59:21.403 回答
3

AS中有一个类叫做ExternalInterface. 它帮助 flash 与 JS 通信(调用 js 函数或 JS 调用 flash 函数)。然后抛出 DOM 可以将内容添加到页面中。可能是这个。

于 2012-05-29T07:02:37.787 回答
3

一个例子

AS3

package {
    import flash.display.Sprite;
    import flash.external.ExternalInterface;
    import flash.events.*;

    public class MyApp extends Sprite {

        private var btn:Sprite;

        public function MyApp() {
            //add an entry point from js (html page) to swf, so js can call the swfFunc
            ExternalInterface.addCallback('swfFunc', swfFunc);

            btn = new Sprite();
            btn.mouseEnabled = true;
            btn.x = 0;
            btn.graphics.beginFill(0xFF0000, 0);
            btn.graphics.drawRect(0, 0, 300, 50);
            btn.graphics.endFill();
            btn.addEventListener(MouseEvent.CLICK, jsFunc);
            addChild(btn);
        }

        public function jsFunc(evt:MouseEvent):void {
            // call the js function named jsFunc 
            ExternalInterface.call('jsFunc', 'Test JS');
        }

        //this method is called from the js
        public function swfFunc(text:String):void {
            trace(text);
        }
    }
}

HTML

<object id='MySWF' type='application/x-shockwave-flash' data='MyApp.swf' width='300' height='50'>
    <param name='movie' value='MyApp.swf' />
    <param name='allowscriptaccess' value='always' />
    <param name='swliveconnect' value='true' />
</object>

<div id="container">
    A Text
</div>
<button type="button" onclick="swfFunc();">Call SWF</button>

JS

function jsFunc(text) {
    document.getElementById('container').innerHTML = text;
}

function swfFunc() {
    var swfObj =  window['MySWF'] || documment['MySWF'];
    swfObj.swfFunc('Test SWF');
}
于 2012-06-01T13:21:54.573 回答
1

不确定这是否可能。

现代浏览器具有相当强大的弹出窗口阻止程序,在大多数情况下,如果没有用户交互,则不允许打开新窗口/选项卡。

即使您设法欺骗了一个浏览器,它也有可能无法在不同的浏览器/操作系统中运行。

顺便说一句,如果页面上没有 JS 并且您无法编辑 HTML,您可以使用“伪协议”直接从 Flash 运行 JS:

var req:URLRequest = new URLRequest('javascript:void(alert('This is called from Flash'))');
navigateToURL(req);

因此,理论上,您可以将相当复杂的 JS “注入”到您的 HTML 页面中。

于 2012-06-03T20:14:27.477 回答
1

有几种方法可以从 Flash 打开一个新的浏览器窗口(没有 HTML 页面的帮助):http ://helpx.adobe.com/flash-player/kb/create-pop-browser-windows-flash.html

于 2012-06-03T18:32:24.917 回答
1

首先,您应该确保您使用的是 window.top.document。从那里尝试打开窗口——如果您的窗口句柄为空,则打开 100% iframe。

    /**
     *  @public
     */
    public function JSTest():void {

        ExternalInterface.call('eval', [

            "window.createFrame = function() {",
                "var doc                = window.top.document;",
                "var ifrm               = doc.createElement('IFRAME');",
                "ifrm.style.position    = 'absolute';",
                "ifrm.style.left        = '0';",
                "ifrm.style.top         = '0';",
                "ifrm.style.width       = '100%';",
                "ifrm.style.height      = '100%';",
                "ifrm.setAttribute('src', 'http://vimeo.com');",
                "doc.body.appendChild(ifrm);",
            "}",

            // try opening window, otherwise, open an iframe
            "if (!window.open('http://www.vimeo.com', '_top')) {",
                "window.createFrame();",
            "}"

        ].join('\n'));

    }
于 2012-06-04T18:31:56.023 回答