【发布时间】:2019-03-11 04:51:08
【问题描述】:
您好,我一直在为一堆 div 创建一个排序函数。为了让它工作,我使用每个 div 的数据属性。要将属性放入 div 我一直在使用 javascript 循环。我从一个 php 页面获取数据,在该页面中,我使用 json_encode 返回变量“peoplelist”中的数据,如下所示(尽管可能有 1000 条记录)。我已经去掉了除 A-z 和数字之外的所有字符,并用 _ 替换它们(这是为了让排序系统正常工作)
[{
"idnum": "100899801298",
"firstname": "Lola",
"surname": "Richards ",
"sortcat1": "possibly bad infor",
"sortcat2": "possibly bad data"
}, {
"idnum": "102697973926",
"firstname": "Lola",
"surname": "Simonson",
"sortcat1": "possibly bad infor",
"sortcat2": "possibly bad data"
}, {
"idnum": "154845984715",
"firstname": "Simon",
"surname": "Jones",
"sortcat1": "possibly bad infor",
"sortcat2": "possibly bad data"
}]
我已经读过创建一个变量并将所有 html 添加到我的名为“putdatahere”的 div 中更有效(见下文)但是在阅读了很多之后似乎这对 XSS 是开放的。
$.ajax({
type: "post",
url: "getdata.php",
cache: false,
success: function(peoplelist) {
var peopleinfo = JSON.parse(peoplelist);
var i,x="";
for (i in peopleinfo) {
var idnumstringed = pupilinfo[i].idnum.replace(/[^a-zA-Z0-9]/g, '_');
var firstnamestringed = pupilinfo[i].firstname.replace(/[^a-zA-Z0-9]/g, '_');
var surnamestringed = pupilinfo[i].surname.replace(/[^a-zA-Z0-9]/g, '_');
var sortcat1stringed = pupilinfo[i].sortcat1.replace(/[^a-zA-Z0-9]/g, '_');
var sortcat2stringed = pupilinfo[i].sortcat2.replace(/[^a-zA-Z0-9]/g, '_');
var sortcat3stringed = pupilinfo[i].sortcat3.replace(/[^a-zA-Z0-9]/g, '_');
var x+='<div id="pupdiv'+idnumstringed+'" data-firstname="'+firstnamestringed+'" data-surname="'+surnamestringed+'" data-sortcat="'+sortcat1stringed+'" data-sortcat2="'+sortcat2stringed+'">'+firstname+' '+surname+'</div>';
}
$("#putdatahere").html(x);
}
});
我读过,使用未知数据的唯一安全方法是将其放入 .text 而不是 .html。我不知道如何用上面的方法做到这一点,所以我现在已经附加了每个 div(见下文)
$.ajax({
type: "post",
url: "getdata.php",
cache: false,
success: function(peoplelist) {
var peopleinfo = JSON.parse(peoplelist);
var i,x="";
for (i in peopleinfo) {
var idnumstringed = pupilinfo[i].idnum.replace(/[^a-zA-Z0-9]/g, '_');
var firstnamestringed = pupilinfo[i].firstname.replace(/[^a-zA-Z0-9]/g, '_');
var surnamestringed = pupilinfo[i].surname.replace(/[^a-zA-Z0-9]/g, '_');
var sortcat1stringed = pupilinfo[i].sortcat1.replace(/[^a-zA-Z0-9]/g, '_');
var sortcat2stringed = pupilinfo[i].sortcat2.replace(/[^a-zA-Z0-9]/g, '_');
var sortcat3stringed = pupilinfo[i].sortcat3.replace(/[^a-zA-Z0-9]/g, '_');
$("#putdatahere").append('<div id="pupdiv'+idnumstringed+'" data-firstname="'+firstnamestringed+'" data-surname="'+surnamestringed+'" data-sortcat="'+sortcat1stringed+'" data-sortcat2="'+sortcat2stringed+'"></div>');
$("#pupdiv"+idnumstringed).text(firstname+' '+surname);
}
}
});
我的问题是:
1) 上述 append 方法对 XSS 或其他攻击安全吗?
2) 有没有更好的方法来做到这一点?
【问题讨论】:
-
使用 .text 和属性通过 .attr 插入文本,这样会很安全。 append 绕过了这些安全措施
-
谢谢凯文。你能举个例子说明我会怎么做吗?
-
不,请参阅文档。
-
什么文件?我希望能够修改数据属性,并且我已经读到如果我使用 .attr("data-something") 我就不需要使用 .data()。只是在寻找一种方法来理解您的评论。这不就是这个网站的全部内容吗?
-
您要求提供使用我提到的东西的示例。文档已经说了一些例子,我认为没有必要重复它们。 (如果你想看的话,它们在这里也被重复了数千次,但文档更容易找到)
标签: javascript php json ajax xss