我有一个字符串,我在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'Oreal
}
var jsonToSend = JSON.stringify(rowValues);
我尝试构建一个jsFiddle,但是我没有在这个非常基本的例子中看到这种情况,它模仿字符串在实际代码中被分配的次数。
编辑2:我知道为什么现在这样。我们HTML来自服务器时对数据进行编码以避免XSS注入。虽然它显示正常,但当我将此数据转换为JSON时,它会导致格式错误,服务器认为该JSON具有潜在危险并引发异常。
服务器端代码(.Net C#) - WebUtility.HtmlEncode(数据);
仍然不知道处理这个问题的好方法可能是什么。
答案 0 :(得分:0)
var str = "This is a test string with L'Oreal in it.";
var regex = /'/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'Oreal in it and an ampersand & in it";
var whiteList = {
"'":"'",
"&":"&"
};
var specialCharDecoder = /'|&/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);