如何在iframe中设置元素的值?

时间:2017-09-20 22:56:56

标签: javascript google-chrome iframe evernote

我需要在iframe的文档中设置几个元素的value属性。我可以通过Chrome Tools控制台轻松完成此操作。但是相同的命令不适用于由Keyboard Maestro或AppleScript注入页面的JavaScript。

iframe由Chrome扩展程序生成:Evernote Web Clipper。 在下面的例子中,我已经调用了Evernote Web Clipper。

enter image description here

在我选择了iframe文档后,此脚本/命令可在Chrome控制台中运行:



var remElem = document.getElementById("comments");
remElem.value = "KM This is a test";
var titleElem = document.getElementById("title")
titleElem.value = 'KMTEST title'




我怀疑在运行上述脚本之前,我首先需要获取或选择iframe文档。我该怎么做?

我尝试了很多不同的SO解决方案,但都没有。

以下是Chrome Tools中主要文档的屏幕截图:

Main Document in Chrome Tools

Chrome Tools中iframe文档的屏幕截图:

enter image description here

这是我尝试过的,但未成功:



// *** NONE of These Work ***

//--- Method 1 ---
var frame = window.frames[‘frame1’];
var documentObj = frame.document;
var element = documentObj.getElementsByName(‘frame1Text’); 

//--- Method 2 ---
var frame = document.getElementById(‘myframe1’);
var documentObj = frame.contentWindow.document;
var element = documentObj.getElementById(‘frame1Text’);

//--- Method 3 ---
window.frames[1].document.getElementById('someElementId')




例如,从Chrome Tools中选择主文档时



//--- From Chrome Tools with Main document selected ---

enFrm = document.getElementById("evernoteGlobalTools")
/*RESULTS
<iframe id=​"evernoteGlobalTools" src=​"chrome-extension:​/​/​pioclpoplcdbaefihamjohnefbikjilc/​content/​global_tools/​global_tools.html" class=​"evernoteClipperVisible" style=​"height:​ 528px !important;​">​</iframe>​
*/

oDoc = enFrm.contentWindow.document;
/* ERROR
VM882:1 Uncaught DOMException: Blocked a frame with origin "http://forum.latenightsw.com" from accessing a cross-origin frame.
    at <anonymous>:1:27
(anonymous) @ VM882:1
*/

oDoc = enFrm.contentWindow.document;

/* ERROR
VM892:1 Uncaught DOMException: Blocked a frame with origin "http://forum.latenightsw.com" from accessing a cross-origin frame.
    at <anonymous>:1:27
*/
&#13;
&#13;
&#13;

感激地接受任何/所有建议/想法。

1 个答案:

答案 0 :(得分:5)

您面临的错误:

  

未捕获DOMException:阻止原始“http://forum.latenightsw.com”的帧访问跨源帧。

明确指出您的代码因Cross-Origin Resource Sharing restriction(A.K.A。内容安全政策或evn CORS)而被屏蔽。

chrome-extension相比,您的域 forum.latenightsw.com 被认为是不一样的:/ / pioc ... (主页扩展名的注入IFrame的域)。在这种情况下访问IFrame的DOM将是一个巨大的安全漏洞。

我担心没有现实的解决方案可以让您从主页面Javascript上下文中运行此代码。

如果您控制了Chrome扩展程序,则可以尝试在清单文件中将您的域添加为主机权限(如果这确实相关)。 (关于Google Chrome documentation的更多细节) 我不确定window.postMessage会对你有所帮助。

如果要执行静态代码,可以创建包含代码的 Bookmarklet ,然后让访问者将其添加到书签(栏)并单击它以执行更改。但这不是一个现实的解决方案,并不适合您的需要。

修改

回应«请帮助我理解为什么这不再是安全问题»评论。

浏览器在上下文中使用沙箱代码,每个上下文都有自己的一组安全限制,其中一些({大多数)有关于XSS attacks的风险。

WEB页面是最容易受到攻击的上下文,任何浏览器在获取其URL后都会执行它包含的代码。这是攻击的理想目标(例如XSS),因为访问受影响网站的人越多,人们支付的费用就越多。这就是为什么存在诸如Cross-Origin Resource Sharing之类的限制,它会阻止不同的帧(具有不同的域)默认访问彼此的文档。 有一些因素可以缓解攻击,例如:已确定的开源过时CMS中的安全漏洞,包括未正确转发来自数据库的内容,让 标记出现在页面源中(然后由浏览器执行) ......)等等。

在“扩展”上下文中,某些API要求开发人员在扩展程序permissions中明确要求manifest file。如果已声明ActiveTab permission,则授予与当前页面(活动选项卡)的交互。安装扩展程序后,您可以访问扩展程序请求的API。

开发人员控制台上下文是一个特例。从他们那里执行的是什么,只会影响你的经验。 可以猜测,与网站源代码(可能使用XSS attacks注入恶意代码的代码)相比,风险相当有限。 换句话说,只有您在控制台中输入的代码才会在那里被执行,并且WEB页面中的代码不会访问控制台上下文。
当您通过代码在控制台中执行时,您可能有经验丰富的浏览器警告您有关风险的信息,当且仅当您了解代码将执行的操作时,或者至少如果您完全信任代码段的作者/来源,则告诉您这样做。

一个(不那么)虚构的场景:从主页访问Iframe个内容。 假设我们有一个包含恶意脚本的网页。此脚本可以尝试通过定期扫描DOM节点并查找特定扩展注入内容来识别已安装的扩展,并最终访问该内容。

这一切让我想起了interesting article给开发者。