Я пытаюсь отобразить ошибку пользователю веб-страницы с помощью всплывающего окна предупреждения JavaScript, у меня в настоящее время есть следующий код для очистки строки ошибки:
errorMessage.Replace("'", "\'")
Но это не достаточно, поскольку некоторые запрещенные символы не удаляются, там статический метод где-нибудь в платформе, которая отформатирует мою строку для чистой вставки в HTML?
Обновление: мой начальный вопрос был немного неоднозначен. строка должна быть допустимой как на предупреждении ('это - некоторый 'недопустимый текст', который не раскроется'); я попробую Сервер. HtmlEncode, надо надеяться, это добьется цели.
Если вы посмотрите на модуль AntiXSS в Библиотеке веб-защиты , вы обнаружите, что в нем есть метод JavaScriptEncode (string)
именно для этого.
Чтобы экранировать строку для чистой вставки в HTML, вы можете использовать метод HttpUtility.HtmlEncode
. Я не уверен, что это поможет вам с javascript.
Если вы используете ASP.NET 4, вы можете использовать новый синтаксис <%:%> для HtmlEncode сгенерированной строки И заменить кодировщик по умолчанию на AntiXSS или любую другую библиотеку, которую вы можете предпочесть. Фил Хаак объясняет, как это сделать, в Использование AntiXss в качестве кодировщика по умолчанию для ASP.NET
Таким образом вы можете написать предупреждение, подобное этому:
alert('<%: this.ErrorMessage %>');
В предыдущих версиях вы можете использовать то, что предлагали другие, либо HtmlEncode или AntiXss, например:
alert('<%= HttpUtility.HtmlEncode(this.ErrorMessage) %>');
или
alert('<%= AntiXss.HtmlEncode(this.ErrorMessage) %>');
Спасибо за помощь, но ни один из представленных ответов не дал мне полного решения.
Ответ Джо был наиболее близким, но он не учитывал \ r \ n новую строку. Я не мог найти способ перевести новую строку С # в эквивалент javascript.
public static string EscapeAlertMessage(string value)
{
value = value.Replace("\\", "\\\\");
value = value.Replace("'", "\\'");
value = value.Replace("\"", "\\\"");
value = value.Replace(Environment.NewLine, "--");
return value;
}
HttpUtility.HtmlEncode
не кодирует одинарные кавычки (') и не подходит для кодирования строки, которая будет использоваться в качестве предупреждающего сообщения. Лично я делаю это так:
public static string EscapeAlertMessage(string value)
{
value = value.Replace("\\", "\\\\");
value = value.Replace("'", "\\'");
value = value.Replace("\"", "\\\"");
return value;
}
Если ваше сообщение содержит несколько строк, вы можете заменить их на "\ n" - например, если строки разделены Environment.NewLine:
value = value.Replace(Environment.NewLine, "\\n");
Или, если вы не знаете, что такое разделители (только \ r \ n, \ n или \ r), вы можете использовать:
value = value.Replace("\r", "\\r");
value = value.Replace("\n", "\\n");
Есть простое решение... используйте DataContractJsonSerializer и "сериализуйте" строковое значение. Сериализуя строку в JSON, вы по определению гарантируете, что она будет хорошо работать внутри оператора оповещения.
Вы хотите избежать XSS-уязвимостей, и это хорошо. Следующая шпаргалка должна помочь вам (а также содержит ссылку на код для экранирования строки):
http://www.owasp.org/index.php/XSS_(Cross_Site_Scripting)_Prevention_Cheat_Sheet