Я пытаюсь передать вывод исключения SQL Server клиенту, использующему RegisterStartUpScript
метод ScriptManager MS в.NET 3.5. Это хорошо работает для некоторых ошибок, но когда исключение содержит одинарные кавычки аварийные сбои.
Я не хочу только выходить из одинарных кавычек все же. Существует ли стандартная функция, которую я могу вызвать для выхода из каких-либо специальных символов для использования в JavaScript?
string scriptstring = "alert('" + ex.Message + "');";
ScriptManager.RegisterStartupScript(this, this.GetType(), "Alert", scriptstring , true);
Править:
Спасибо @tpeczek, код почти работал на меня :) но с небольшой поправкой (выход одинарных кавычек) он работает обработка.
Я включал свою исправленную версию здесь...
public class JSEncode
{
///
/// Encodes a string to be represented as a string literal. The format
/// is essentially a JSON string.
///
/// The string returned includes outer quotes
/// Example Output: "Hello \"Rick\"!\r\nRock on"
///
///
///
public static string EncodeJsString(string s)
{
StringBuilder sb = new StringBuilder();
sb.Append("\"");
foreach (char c in s)
{
switch (c)
{
case '\'':
sb.Append("\\\'");
break;
case '\"':
sb.Append("\\\"");
break;
case '\\':
sb.Append("\\\\");
break;
case '\b':
sb.Append("\\b");
break;
case '\f':
sb.Append("\\f");
break;
case '\n':
sb.Append("\\n");
break;
case '\r':
sb.Append("\\r");
break;
case '\t':
sb.Append("\\t");
break;
default:
int i = (int)c;
if (i < 32 || i > 127)
{
sb.AppendFormat("\\u{0:X04}", i);
}
else
{
sb.Append(c);
}
break;
}
}
sb.Append("\"");
return sb.ToString();
}
}
Как упомянуто ниже - первоисточник: здесь
Проблема с этой функцией заключается в том, что она не кодирует символы, которые обычно не используются при инкапсуляции HTML ... поэтому у вас возникнут проблемы, если вы попытаетесь включить строку с "
внутри значения атрибута, или если у вас есть строка с последовательностью
внутри элемента сценария. Это может привести к внедрению сценария и XSS.
Вы можете добавить:
case '<':
sb.Append("\\x3C");
break;
case '"':
sb.Append("\\x22");
break;
case '&':
sb.Append("\\x26");
break;
В общем, вероятно, было бы лучше использовать стандартный кодировщик JSON, чем варить свой собственный кодировщик строковых литералов JS. Это позволит вам передавать любой простой тип данных в JS, а не только строки.
В .NET 3.5 вы получите JavaScriptSerializer , однако обратите внимание, что пока этот делает кодирует <
в \ u003C
(поэтому выходные данные будут подходящими для использования в сценарии < >
элемент), он не кодирует &
или "
, поэтому потребуется экранирование HTML, чтобы включить такое содержимое в значение атрибута и CDATA обертка потребуется для элементов сценария XHTML.
(Как и многие кодировщики JSON, он также не может кодировать символы U + 2028 LINE SEPARATOR и U + 2029 PARAGRAPH SEPARATOR. Приведенный выше код делает это из-за экранирования всех символов, отличных от ASCII. Это вызывает незавершенный строковый литерал 'ошибки, когда эти символы включены в строковый литерал JS, потому что JavaScript бесполезно обрабатывает их так же, как новую строку ASCII.)
Have you had had a look at HttpUtility.JavaScriptStringEncode
?