我有Bloggers
和Blogs
。每个blog
都与blogger
相关联。这是博客记录的图片:
请注意,Jennell的第一个title
的{{1}}属性有一些javascript,如果在某些情况下未正确消毒,可能会触发。
这正是其中一种情况。我有两个选择框:
对于第一个选择框:用户选择blog
。发生这种情况时:
Blogger
的所有关联Blogs
Blogger
抓取到该blogs
并将其发送回请求者blogger
选择框Blog
选择框中的选项添加为服务器上抓取的所有Blog
。名为Jennell的blogs
有一个关联的Blogger
,其中blog
包含javascript hack。因此:当Jennell title
被选中时:
她关联的Blogger
内的黑客将被执行:
以下是AJAX请求的实际代码:
Blog
AJAX请求中的问题是这一部分:
$("body").on('change', '[data-action="blogger_sel"]', function() {
var blog_sel = $(this).closest('[data-parent-for="blog_sel"]').find('[data-action="blog_sel"]');
$.ajax({
url: "/blogs",
type: "GET",
data: {blogger_id: $(this).val()},
success: function (data) {
blog_sel.children().remove();
$.each(data, function (index, value) {
/* DO NOT APPEND THIS WAY. VULNERABLE TO USER-ENTERED JAVASCRIPT EXECUTING */
blog_sel.append('<option value=' + value.id + '>' + value.title + '</option>');
});
}
})
});
我需要消毒它。
问题:在AJAX回复中:如何清理value.title
?
答案 0 :(得分:1)
通过属性设置文本/值,而不是html字符串。
var str = "<script>alert('x');<\/script>Test",
opt = $("<option></option>", { "text" : str, value : "foo" });
$("select").append(opt);
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<select></select>
&#13;
答案 1 :(得分:0)
如果有人想看到问题的代码解决方案:
$("body").on('change', '[data-action="blogger_sel"]', function() {
var blog_sel = $(this).closest('[data-parent-for="blog_sel"]').find('[data-action="blog_sel"]');
$.ajax({
url: "/blogs",
type: "GET",
data: {blogger_id: $(this).val()},
success: function (data) {
blog_sel.children().remove();
$.each(data, function (index, item) {
blog_sel.append($('<option>', {
value: item.id,
text : item.title
}));
});
}
})
});