我需要在iframe的文档中设置几个元素的value
属性。我可以通过Chrome Tools控制台轻松完成此操作。但是相同的命令不适用于由Keyboard Maestro或AppleScript注入页面的JavaScript。
iframe由Chrome扩展程序生成:Evernote Web Clipper。 在下面的例子中,我已经调用了Evernote Web Clipper。
在我选择了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中主要文档的屏幕截图:
Chrome Tools中iframe文档的屏幕截图:
这是我尝试过的,但未成功:
// *** 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;
感激地接受任何/所有建议/想法。
答案 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给开发者。