Существует ли стандартный способ закодировать строку.NET в строку JavaScript для использования в Ajax MS?

Я пытаюсь передать вывод исключения 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();
    }
}

Как упомянуто ниже - первоисточник: здесь

73
задан Rich Andrews 22 July 2013 в 08:27
поделиться

2 ответа

Проблема с этой функцией заключается в том, что она не кодирует символы, которые обычно не используются при инкапсуляции 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.)

10
ответ дан 24 November 2019 в 12:10
поделиться

Have you had had a look at HttpUtility.JavaScriptStringEncode?

180
ответ дан 24 November 2019 в 12:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: