Проблема с этой функцией заключается в том, что она не кодирует символы, которые обычно являются внеполосными при инкапсуляции HTML ... поэтому у вас возникнут проблемы, если вы попытаетесь включить строку с "
внутри атрибута значение, или если у вас была строка с последовательностью </script>
внутри элемента скрипта. Это может привести к инъекции сценария и XSS.
Вы можете добавить:
case '<':
sb.Append("\\x3C");
break;
case '"':
sb.Append("\\x22");
break;
case '&':
sb.Append("\\x26");
break;
В общем, было бы лучше использовать стандартный кодировщик JSON, чем создавать собственный строковый литерал кодировщика JS. Это позволит вам передавать любые простые типы данных в JS, а не только в строки.
В .NET 3.5 вы получаете JavaScriptSerializer , однако обратите внимание, что пока действительно кодирует <
в \u003C
(поэтому выходные данные будут пригодны для использования в <script>
element), он не кодирует &
или "
, поэтому для включения такого содержимого в значение атрибута потребуется экранирование HTML, а для элементов сценария XHTML потребуется обертка CDATA.
(Как и во многих кодировщиках JSON, он также не может кодировать символы LINE SEPARATOR U + 2028 и PARAGRAPH SEPARATOR U + 2029. Приведенный выше код делает это из-за экранирования всех не-ASCII символов. 'ошибки, когда эти символы включены в строковый литерал JS, потому что JavaScript бесполезно обрабатывает их так же, как перевод строки ASCII.)