我知道您可以在获取集合时关闭与reactive: false
的反应。如何在一个可信区域内的收集领域完成相同的工作?例如:
Template.documentPage.events({
'input .document-input': (function(e) {
e.preventDefault();
content = $(e.target).html();
Documents.update(this._id, {
$set: {
content: content
}
});
}
});
<template name="documentPage">
<div class='document-input' contenteditable='true'>{{{content}}}</div>
</template>
答案 0 :(得分:1)
转变例如帮助程序或其他反应函数使用Tracker.nonreactive(fn)包装您的函数。请参阅:http://docs.meteor.com/#/full/tracker_nonreactive
答案 1 :(得分:0)
您可以将反应数据设置为属性并将其移至onRendered
中的html<div class="form-group required">
<label class="col-sm-2 control-label" for="input-firstname"><?php echo $entry_firstname; ?></label>
<div class="col-sm-2">
<input type="text" name="firstname" value="<?php echo $firstname; ?>" placeholder="<?php echo $entry_firstname; ?>" id="input-firstname" class="form-control" />
<?php if ($error_firstname) { ?>
<div class="text-danger"><?php echo $error_firstname; ?></div>
<?php } ?>
</div>
</div>
<div class="form-group required">
<label class="col-sm-2 control-label" for="input-lastname"><?php echo $entry_lastname; ?></label>
<div class="col-sm-2">
<input type="text" name="lastname" value="<?php echo $lastname; ?>" placeholder="<?php echo $entry_lastname; ?>" id="input-lastname" class="form-control" />
<?php if ($error_lastname) { ?>
<div class="text-danger"><?php echo $error_lastname; ?></div>
<?php } ?>
</div>
</div>
这样,数据内容属性将通过输入而不是元素的文本进行更新。
安全注意:我将模板更改为使用<template name="documentPage">
<div class='document-input' contenteditable='true' data-content='{{content}}'></div>
</template>
Template.documentPage.onRendered(function () {
var doc = this.find(".document-input");
doc.innerHTML = doc.dataset.content;
});
而不是{{content}}
,因此可以通过流星进行转义,但使用{{{content}}}
,因此内容将是&#34;未转义&#34;在元素中。每当您从用户输入呈现html时,您应该确保清理它,这样您就不会在您的网站中打开xss漏洞。
另一种方法是使用像https://github.com/UziTech/jquery.toTextarea.js这样的库来将div的可编辑内容更改为文本,并使用doc.innerHTML
代替doc.textContent
以删除任何xss的机会