Правильный ответ - двойное кодирование текста.Сначала с JavascriptEncode
, а затем с XmlAttributeEncode
.Это объясняется тем, что все, что находится в атрибуте xml / html, должно быть закодировано в атрибуте XML.Парсер браузера будет интерпретировать это как атрибут xml и декодировать его таким образом.Браузер будет передавать этот декодированный текст интерпретатору javascript, и поэтому он должен быть правильно закодирован для предотвращения утечки безопасности.
Это двойное кодирование не приведет к недопустимым результатам, поскольку браузер также будет дважды декодировать этот текст (потому что задействованы два отдельных переводчика).Вот пример правильного кодирования.
string unsafeText = "Hello <unsafe> ');alert('xss');alert('";
string javaEncoded = AntiXss.JavascriptEncode(unsafeText, false);
ENCODED_STRING = AntiXss.XmlAttributeEncode(javaEncoded);
<input type="button" onclick="alert('[ENCODED_STRING]');"
value="Click me" />
Хотя двойное кодирование является единственным правильным способом сделать это, я хотел бы отметить, что использование только кодировки JavaScript обычно дает правильный результат.Здесь ограничение заключается в том, что текст атрибута помещается в кавычки.
Кодировка JavaScript использует тот же белый список (за исключением символа пробела), что и кодировка атрибута HTML / XML.Разница между ними заключается в том, как кодируются небезопасные символы.Javascript кодирует их как \ xXX и \ uXXXX (например, \ u01A3), а атрибут XML кодирует их как & # XX;и & # XXXX;(например, A3;).При кодировании текста с использованием кодировки JavaScript остается только два символа, которые будут снова закодированы кодировщиком атрибута XML, а именно символ пробела и символ обратной косой черты.Эти два символа могут стать проблемой только тогда, когда текст атрибута не заключен в кавычки.
Обратите внимание, однако, что только использование кодирования атрибута XML в этом сценарии НЕ даст правильного результата.