使用第三方集成工具对HTML进行双重编码

问题描述

我们使用需要发送电子邮件和姓名的JavaScript代码集成了第三方应用。

此电子邮件和姓名来自上一步注册表格。

因为我们需要在页面上打印电子邮件名称,然后对其进行编码。

some.survey({
    email: "test@test.pt",name: "Mon & Sons",properties: {"one":"123","two":"345"}
});

问题在于,打印之前的第三方再次对我们的字符串进行编码,在浏览器中显示"Mon & Sons"

有人知道如何解决这个问题吗?

解决方法

这是一种方法(基于https://stackoverflow.com/a/784698):

function DecodeHTML(txt) {
  var el = document.createElement("div");
  el.innerHTML = txt;
  return el.innerText;
};

DecodeHTML("Mon & Sons");
//"Mon & Sons"

编辑:但是请注意XSS攻击。第三方应用程序可能会这样做,以将'转换为'并将"转换为",因此您可能希望在上述构想的基础上防止这种情况,具体取决于您的需求。例如,如果您要在HTML页面上显示此信息,请仅在该页面中设置元素的innerText,例如nameelement.innerText = nametext;

,

sbgib关于它如何工作几乎是正确的。因此,我们现在将编码后的字符串输出,并使用Javascript对其进行解码,然后再将其发送到外部服务。

function DecodeHTML(txt) {
  var el = document.createElement("div");
  el.innerHTML = txt;
  return el.innerText;
}

some.survey({
    email: "test@test.pt",name: DecodeHTML("Mon & Sons"),properties: {"one":"123","two":"345"}
});