Кодирующий Апостроф

Я создаю строку на сервере, которая помещается в переменную javascript на клиенте.

что лучше всего кодировать, чтобы избежать каких-либо проблем

сейчас на сервере я делаю что-то вроде этого:

 html = html.Replace("'", "'");

но я предполагаю, что есть более элегантный способ доказательства глупости делать такие вещи.

5 ответов


лучше использовать Библиотека Сценариев Microsoft Anti-Cross Site для этого. Они предоставляют метод JavaScriptEncode, который делает то, что вы хотите:

Microsoft.Security.Application.AntiXss.JavaScriptEncode("My 'Quotes' and ""more"".", False)

Я не уверен, в каком контексте вы используете эту строку, но \' может быть то, что вы ищете. Обратная косая черта является Escape-символом и позволяет использовать некоторые символы это не может иначе присутствовать в строковом литерале. Вот как должен выглядеть выходной JavaScript:

alert('It\'s amazing');

конечно, вы могли бы использовать alert("It's amazing"); в данном конкретном случае.

в любом случае, если вы создаете код JavaScript:

html = html.Replace("'", "\'");

на с другой стороны, есть и другие символы, помимо апострофов, которые нуждаются в некоторой обработке. С помощью Библиотека Сценариев Microsoft Anti-Cross Site получит все сразу.


html = html.Replace("'", "%27");

я обнаружил, что библиотека AntiXSS не смогла выполнить то, что я искал, а именно кодировать серверную сторону и декодировать в javascript.

вместо этого я использовал Microsoft.язык JScript.dll, которая позволяет:

GlobalObject.escape(string);

и на стороне клиента в JavaScript:

unescape(string);

символы, которые вам нужно избежать в строковом значении, - это обратная косая черта и символ, используемый в качестве разделителя строк.

Если apostrophes ( ' ) используются в качестве разделителя строк:

html = html.Replace(@"\", @"\").Replace("'", @"\'");

Если в качестве разделителя строк используются кавычки ("):

html = html.Replace(@"\", @"\").Replace(@"""", @"\""");

Если вы не знаете, какой разделитель используется, или если он может измениться в будущем, вы можете просто избежать обоих:

html = html.Replace(@"\", @"\").Replace("'", @"\'").Replace(@"""", @"\""");