0

我有一个字符串,我在 Javascript 中执行 JSON.stringify(str) 。字符串是欧莱雅。

然而,由于这个变量在 JSON.stringify 发生之前被传递,它的值变成

L& #39;Oreal(& 和 # 之间没有空格),并且我发送到服务器的结果 JSON 字符串被识别为潜在危险,并且我收到服务器端错误。

我的问题是,如何避免撇号被 <'>; 替换 在 stringify 调用之前,还是解决此问题的替代方法?

编辑1:这是导致此问题的一些代码,它非常基本-

for (var rowIndex = 0; rowIndex < numrows; rowIndex++)
{
     var cellValues = new Array();
     for (var cellIndex=0; cellIndex < numCols; cellIndex++)
     {
          cellValues[cellIndex] = someInputArray[cellIndex]; //One of the values that gets populated here inlcudes the word L'Oreal
     }
     rowValues[rowIndex] = cellValues; //After this assignment, rowValues[0][3] which was earlier L'Oreal becomes L&#39;Oreal
}

var jsonToSend = JSON.stringify(rowValues);

我尝试构建一个 jsFiddle,但在这个非常基本的示例中没有看到这种情况发生,它模仿了在实际代码中分配字符串的次数。

编辑2:我知道为什么现在会发生这种情况。我们对来自服务器的数据进行 HTML 编码,以避免 XSS 注入。虽然它显示正常,但当我将此数据转换为 JSON 时,它会导致格式错误的 JSON,服务器将其识别为潜在危险并引发异常。

服务器端代码 (.Net C#)- WebUtility.HtmlEncode(Data);

仍然不知道处理这个问题的好方法是什么。

4

2 回答 2

0
var str = "This is a test string with L&#39;Oreal in it.";
var regex = /&#39;/g;
var output = JSON.stringify(str.replace(regex, "'"));
$('#test').html(output);

您可以使用正则表达式来嗅出特殊字符代码并在将其字符串化之前将其替换回来。注意:上面正则表达式中的“g”使搜索成为全局搜索,因此它将替换“'”的任何实例。上面的代码应该可以工作。这是一个 jsfiddle 演示。http://jsfiddle.net/pJD9X/1/

编辑:备用白名单方法。您可以创建一个特殊字符的白名单,并采用类似于 underscor.js 实际编码内容的方法。只有解码而不是编码。注意:这可能是一个危险的解决方案,因为它允许您的代码解码特殊字符

var str = "This is a test string with L&#39;Oreal in it and an ampersand &#38; in it";
var whiteList = {
    "&#39;":"'",
    "&#38;":"&"
};
var specialCharDecoder = /&#39;|&#38;/g;
function htmlDecode (string) {
    return ('' + string).replace(specialCharDecoder, function (match) {
       return whiteList[match]; 
    });
}
var output = htmlDecode(str);
于 2013-04-26T16:21:18.743 回答
0

虽然 Mike 提供的解决方案适用于孤立的情况,但在我的情况下,用户可以输入带有任何特殊字符的信息,并且无法预测将使用的一组特殊字符。

为了克服这个问题,我在 JSON 化之前手动解码每个值 -

for (var rowIndex = 0; rowIndex < numrows; rowIndex++)
{
    var cellValues = new Array();
    for (var cellIndex=0; cellIndex < numCols; cellIndex++)
    {//FIX BELOW
        cellValues[cellIndex] = $('<div />').html(someInputArray[cellIndex]).text(); //manually decode
    }
    rowValues[rowIndex] = cellValues; 
}

var jsonToSend = JSON.stringify(rowValues);
于 2013-04-29T19:33:18.423 回答