2013-04-26 2 views
0

У меня есть строка, в которой я делаю JSON.stringify (str) в Javascript. Строка - L'Oreal.apostrophe в JSON вызывает ошибки на сервере

Однако, поскольку эта переменная получает передается вокруг, прежде чем произойдет JSON.stringify, его значение становится

L & # 39; Oreal (без пространства между & и #), и полученную JSON строку, я отправить к серверу признается потенциально опасным, и я получаю ошибку на стороне сервера.

Мой вопрос: как мне избежать замены апострофа на < & # 39>; перед вызовом stringify или альтернативным способом решения этого вопроса?

EDIT 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, но я не вижу этого там происходит в этом очень простом примере, который имитирует # раз строка присваивается в фактическом коде.

EDIT 2: Я знаю, почему это происходит сейчас. Мы HTML Кодируем данные, когда они поступают с сервера, чтобы избежать внедрения XSS. Пока он отображается хорошо, когда я конвертирую эти данные в JSON, это приводит к плохо сформированному JSON, который сервер распознает как потенциально опасный и генерирует исключение.

Код на стороне сервера (.Net C#) - WebUtility.HtmlEncode (данные);

По-прежнему не знаю, какой хороший способ справиться с этим может быть.

+2

Покажите код, который вызывает символ, который будет заменен на лицо в первую очередь. – Barmar

+0

Нужно посмотреть какой-нибудь код, пожалуйста. –

+0

Любая причина, по которой вы используете 'new Array()' вместо '[]'? Это не имеет никакого отношения к проблеме апострофа, но использование '[]' действительно является лучшим способом создания массива. –

ответ

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/

EDIT: альтернативный подход к белым. Вы могли бы создать белый список специальных символов и принять подход, похожий на то, как 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); 
+0

Не лучше ли было бы избежать замены в первую очередь? В противном случае, да, это допустимый вариант. –

+0

Да, я бы хотел избежать этого, если возможно – neuDev33

+0

@ neuDev33 Вы хотели бы избежать этого из-за проблем с производительностью? Только спрашивая, есть ли другое решение, которое мы можем найти, исходя из вашей озабоченности. – Dropzilla

0

Хотя решение, что Майк дал будет работать нормально для отдельных случаев, в моей ситуации пользователь может вводить информацию с любыми специальными символами и нет никакого способа предсказать набор специальных символов, которые будут использоваться.

Для того, чтобы над Пойдемте, я вручную декодирования каждого значения перед 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); 
+0

Я просто понял, что это нехорошее решение. Это приведет к тому, что ваше приложение будет подвергнуто XSS-инъекции. Вот дополнительная информация - http://benv.ca/2012/10/4/you-are-probably-misusing-DOM-text-methods/ – neuDev33

Смежные вопросы