- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
请仔细阅读此声明:让我们假设在将任何元素添加到 document
之前$dom 中的所有 不安全元素已被删除。但它们最初是被创造出来的。好的,让我们继续....
如果一段用户文本被处理并且可以像这样加载:
var comment = 'I\'m a naughty person!!' +
'<script src="http://blah.com/some_naughty_javascript.js">';
var $dom = $('<div>' + comment + '</div>');
这本身有任何危险吗?我的观点是,创建 DOM 的简单行为是否可以以某种方式注入(inject)任何东西,或者只是简单地处理并创建结构?
例如:
var $dom = $('<script>alert("hi");</script>');
显然消息 hi 不会弹出,直到它被添加到 document
.但是:
所以正如下面的答案所概述的那样,这种方法似乎不是很安全,特别是出于一个原因:
var $dom = $('<img src="blah.jpg"/>')
-- 这将立即请求图像,无论对象是否已添加到文档中。这为处理 HTML ajax 请求带来了一个主要问题。例如,如果我们想从表单的输入中获取值:
$.ajax({
url: 'test.php',
success: function(responseHTML) {
var inputs = $(responseHTML).find('form input');
}
});
这将不由自主地导致浏览器请求所有图像。
赏金授予任何人:
$(responseHTML).find('img')
-- 不能使用正则表达式删除图像标签,因此需要一种不显眼的方式来阻止 src 加载,但仍然具有相同的属性、结构等。最佳答案
Is this by itself dangerous in any way? My point being, can just the simple act of creating a DOM somehow inject anything, or is it just simply processed and the structure is created?
简单地创建一个元素而不将它附加到 dom 将不会导致任何脚本运行,因为此时它只是一个对象 (HtmlScriptElement)。当它实际附加到 dom 时,脚本元素将由浏览器评估和运行。话虽如此,我想一个极其狡猾的人可能会利用您可能使用的某些框架或浏览器中存在的错误来导致意外结果。
考虑这个例子:
<p>
<input type="button" value="Store 'The Script' In Variable" id="store"/>
<input type="button" value="Append 'The Script' To Dom" id="append"/>
</p>
<br/>
<p>
<input type="button" value="Does nothing"/>
</p>
<h1>The Script</h1>
<pre id="script">
$(function(){
function clickIt(){
$(this).clone().click(clickIt).appendTo("body");
}
$("input[type='button']").val("Now Does Something").click(clickIt);
});
</pre>
var theScript;
$("#store").click(function() {
theScript = document.createElement('script');
var scriptText = document.createTextNode($("#script").text());
theScript.appendChild(scriptText);
});
$("#append").click(function() {
var head = document.getElementsByTagName('head')[0];
head.appendChild(theScript);
});
当您点击 store
时它将创建 HtmlScriptElement 并将其存储到一个变量中。您会注意到即使创建了对象也没有运行任何东西。只要你点击append
脚本附加到 dom 并立即评估,按钮执行不同的操作。
Can any functions in javascript/jquery "watch" for elements being created in this manner and act on it BEFORE it's been stripped of bad elements and put on document?
jQuery sort 已经为您做了这件事,就像它做一些内部脚本评估一样
来自 Karl Swedberg在 .append()
上发帖
All of jQuery's insertion methods use a domManip function internally to clean/process elements before and after they are inserted into the DOM. One of the things the domManip function does is pull out any script elements about to be inserted and run them through an "evalScript routine" rather than inject them with the rest of the DOM fragment. It inserts the scripts separately, evaluates them, and then removes them from the DOM. ...
您可以更改 jQuery 的行为以删除所有 <script/>
并使用内联 javascript 清理其他元素 onclick, mouseover, etc
打电话时 append()
然而,这只会影响 jQuery,因为有人可以轻松地使用 vanilla javascript 来附加 <script/>
。元素。
Dom 突变事件
Dom Level 2确实定义了一些 Dom 突变事件来捕获添加到 dom 中的元素,人们会查看事件,DOMNodeInserted .但是,它是在元素已添加后触发的。 注意,根据 Raynos 的说法,这些目前是 deprecated .
DOMNodeInserted Fired when a node has been added as a child of another node. This event is dispatched after the insertion has taken place. The target of this event is the node being inserted. Bubbles: Yes Cancelable: No Context Info: relatedNode holds the parent node
最后似乎没有完全停止一个<script/>
通过其他一些 javascript 附加到 dom。 (至少我找不到)。
我能建议的最好方法是永远不要相信用户输入,因为所有用户输入都是邪恶的。当您进行 dom 操作时,请仔细检查以确保没有禁止的标签,无论是 <script/>
甚至是普通的 <p/>
元素并在持久化之前清理所有输入。
此外,正如 John 指出的那样,您需要担心可以附加 onclick
的任何 元素。事件或任何内联 javascript 事件处理程序。
关于javascript - 在添加到文档之前,Javascript/jQuery DOM 创建是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5594254/
我正在寻找一种使此打印 HTML 代码 fragment 向后兼容旧 Android 版本的简单方法: @TargetApi(Build.VERSION_CODES.KITKAT) private v
我在 GCC 终端 (centos linux) 中为 ATM 项目编译以下 c 和 .h 代码时收到以下错误。请帮忙,因为我是编程新手。 validate_acc.h #ifndef _VALIDA
在写关于 SO 的不同问题的答案时,我制作了这个片段: @import url('https://fonts.googleapis.com/css?family=Shadows+Into+Light'
试图弄清楚我应该如何在 my_div_class 之前放置一个 span 而不是替换所有它。现在它取代了 div,但我不想这样做。我假设它类似于 :before 但不知道如何使用它。 { va
我正在使用选择库 http://github.hubspot.com/select/和 noUiSlider https://refreshless.com/nouislider/ .我面临的问题如下
我是开发新手,独自工作。我正在使用 Xcode 和 git 版本控制。可能我没有适本地组织和做错事,但我通常决定做 promise 只是为了在我破坏一切之前做出安全点。在那一刻,我发现很难恰本地描述我
我想确保在同一个桶和键上读取和写入时,应该更新获取的值,也就是说,应该在对其进行写入操作之后获取它。我怎样才能做到这一点? 我想要的是,如果我更新一个键的值,如果我同时使用不同线程获取值,则更新同一个
我的问题与this有关问题,已经有了答案: yes, there is a happens-before relationship imposed between actionsof the thre
The before and after hook documentation on Relish仅显示 before(:suite) 在 before(:all) 之前调用。 我什么时候应该使用其中
我有 CSV 行,我想在其中检测所有内部双引号,没有文本限定符。这几乎可以正常工作,但我的正则表达式还可以检测双引号后的字符。 CSV 部分: "7580";"Lorem ipsum";"";"Lor
是否可以通过Youtube数据API检查广告是否可以与特定视频一起显示? 我了解contentDetails.licensedContent仅显示视频是否已上传至同一伙伴然后由其声明版权。由于第三者权
考虑一下用漂亮的彩色图表描述的“像素管道” https://developers.google.com/web/fundamentals/performance/rendering/ 我有一个元素(比
之前?
在 MVC3 中,我可以轻松地将 jQuery 脚本标签移动到页面底部“_Layout.vbhtml” 但是,在 ASP.NET MVC3 中,当您使用编辑器模板创建 Controller 时,脚手
悬停时内容被替换,但是当鼠标离开元素时我希望它变回来。我该怎么做? $('.img-wrap').hover(function(){ $(this).find('h4').text('Go
已关闭。这个问题是 not reproducible or was caused by typos 。目前不接受答案。 这个问题是由拼写错误或无法再重现的问题引起的。虽然类似的问题可能是 on-top
已关闭。这个问题是 not reproducible or was caused by typos 。目前不接受答案。 这个问题是由拼写错误或无法再重现的问题引起的。虽然类似的问题可能是 on-top
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 已关闭 9 年前。 有关您编写的代码问题的问题必须在问题本身中描述具体问题 - 并包含有效代码以重现该问题。
版本:qwt 6.0.1我尝试开发频谱的对数缩放。我使用简单的线条来启用缩放plotspectrum->setAxisScaleEngine(QwtPlot::yLeft, new QwtLog10S
我有两个相同的表,I_Subject 和 I_Temp_Subject,我想将 Temp_Subject 表复制到 Subject 表。 I_Temp_Subject 由简单用户使用,I_Subjec
我的印象是第一次绘制发生在触发 DOMContentLoaded 事件之后。特别是,因为我认为为了让第一次绘制发生,需要渲染树,它依赖于 DOM 构造。另外,我知道 DOM 构造完成时会触发 DOMC
我是一名优秀的程序员,十分优秀!