2010-09-11 42 views
18

我正在制作一个小型的HTML页面编辑器。编辑器将文件加载到iframe中。从那里,它可以使用新的属性,样式等来添加,修改或删除页面上的元素。问题在于JavaScript(和/或其他编程语言)可以在加载时完全修改页面,之前你开始编辑元素。所以当你保存时,它不会保存原始标记,但修改后的页面+你的更改。在iframe/div中禁用JavaScript

所以,我需要一些方法来禁用的iframe中的JavaScript,或者以某种方式消除所有的JavaScript的JavaScript的开始修改页面之前。 (我想我必须最终解析PHP文件,但这不应该太难)我认为编写一个脚本来遍历所有元素,删除任何标签,onclick,onfocus,onmouseover等等。但是,那将是一个真正的痛苦。

有谁知道一个更简单的方式来获得一个iframe中运行的JavaScript摆脱的?

更新:除非我已经错过了一些东西,我相信没有办法简单地“禁用JavaScript的。”如果我错了,请纠正我。但是,我想唯一的方法是从请求的页面字符串中解析出任何脚本标记和JavaScript事件(点击,鼠标悬停等)。

+0

这一个谈论的JavaScript遍历页面和删除每次出现一个得到更多的信息-javascript-with-javascript.php – Dan 2010-09-15 19:46:15

+0

那篇文章谈到了删除脚本节点,我不相信会在加载脚本时执行“取消执行js”。 我真的不明白这个问题。什么是文件加载到iframe中?你是否允许用户在iframe中输入任何html?你网页上的所有javascript都来自哪里?这听起来像你可以控制文件的内容 – 2010-09-22 23:01:19

+0

“manticmoo”URL似乎不起作用,但它仍然可以通过Wayback Machine(archive.org)获得:http://web.archive.org/web/ 20070128100901/http://www.manticmoo.com/articles/jeff/programming/javascript/removing-javascript-with-javascript.php – calvinf 2014-08-08 21:00:53

回答

1

您可以尝试CKEditor采用的相同解决方案,其中您有演示here
通过从RTE模式切换到查看源代码模式,您可以输入一些JavaScript并查看结果,该结果是以安全编码的字符串替换JS节点的结果。
如果你在查看源模式,通过输入一些JS一行:

<script type="text/javascript"> 
// comment 
alert('Ciao'); 
</script> 

你会看到回去富文本编辑器模式时,它呈现的是这样的:

<!--{cke_protected}%3Cscript%20type%3D%22text%2Fjavascript%22%3E%0D%0A%2F%2F%20comment%0D%0Aalert('Ciao')%3B%0D%0A%3C%2Fscript%3E--> 

我认为这是最简单有效的方法之一,因为RegExp解析JS节点并不复杂。
一个例子:

var pattern = /<script(\s+(\w+\s*=\s*("|').*?\3)\s*)*\s*(\/>|>.*?<\/script\s*>)/; 
var match = HTMLString.match(pattern); // array containing the occurrences found 

(当然,更换脚本节点应该使用replace()方法)。

问候。

+0

回答您的更新:是的,服务器端验证任务是强制性的,但问题你可能想要在客户端环境中解决的问题是iframe的不正确行为,用户可能会注入一些简单的JavaScript来执行某些允许的操作。我对这个问题的实际经验是,一个用户在可编辑的iframe中输入了一个简单的脚本,用于从另一个域中的另一个iframe中导入表单,该表单导致编辑器页面重定向到空白页面。虽然导入的iframe在预览中工作得很好,但插入代码后编辑器无法访问。 – 2010-11-27 21:17:57

4

是的,你的更新是正确的。您必须假设您从用户收到的任何输入可能包含恶意元素。因此,您必须必须在接受其输入之前在服务器上进行验证:-)

19

HTML5引入上(如果空)禁用JavaScript的加载和执行的IFRAME“沙箱”属性。

https://developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe#attr-sandbox

+0

虽然这是我寻找的解决方案,但请注意,它不仅仅是像OP所要求的那样禁用JavaScript。 [看详细(w3schools)](http://www.w3schools.com/tags/att_iframe_sandbox.asp) – MikeThomson 2015-06-11 18:13:57

+1

[更好的链接](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe#attr-sandbox)[mozilla.org] – Damien 2017-12-11 14:34:25

1

您可以设置内容安全策略脚本-SRC在头 '自我'。 CSP将阻止除我们自己网站以外的任何脚本。这样我们可以防止iframe中的任何脚本改变页面中的元素。http://www.manticmoo.com/articles/jeff/programming/javascript/removing:

你可以从这里http://www.html5rocks.com/en/tutorials/security/content-security-policy/