JSON中的撇号导致服务器出错

时间:2013-04-26 16:09:16

标签: javascript json special-characters html-encode stringify

我有一个字符串,我在Javascript中正在进行JSON.stringify(str)。字符串是L'Oreal。

但是,由于此变量在JSON.stringify发生之前传递,因此其值变为

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

我的问题是,如何避免撇号被<&#39>取代;在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(数据);

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

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分:0)

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

为了解决这个问题,我在JSONifying它之前手动解码每个值 -

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);