Во-первых, я много читал/исследовал эту тему, но я все еще немного сбит с толку относительно того, что для этого лучше всего.
Я проверил И ПРОЧИТАЛ ВСЕ следующие очень полезные и информативные страницы по этому вопросу:
https://www.owasp.org/index.php/XSS_(Cross_Site_Scripting)_Prevention_Cheat_Sheet
http://msdn.microsoft.com/en-us/library/ms437314.aspx
как кодировать атрибут href в HTML
HttpServerUtility.UrlPathEncode и HttpServerUtility.UrlEncode
Это моя установка (позже переменная содержимого будет отображаться с помощью Html.Raw()
):
content += "<a class=\"contentLink\" href=\"" + subRow.linkHref + "\" target=\"_blank\">" + subRow.linkText + "</a>";
Кодирование subRow.linkText
достаточно просто (только простой метод HtmlEncode обеспечит это), однако я, как и другие, запутался в том, как кодировать атрибут href с учетом ресурсов (показанных в приведенных выше ссылках) и лучших практик на сегодняшний день.
ОБНОВЛЕНИЕ: все, что вставляется в атрибут href, вводится пользователем. Я хочу, чтобы это было так, чтобы они могли либо указать путь к тому, что они публикуют на Google Диске или любом другом связанном сайте, либо даже реляционный путь (созданный программно) к внутреннему файлу .pdf или изображению, если они захотят.
Я понимаю разницу между доступными мне методами, но я не уверен, какие или сколько мне следует применить и в каком порядке? Должен ли я вообще использовать HttpUtility.HtmlAttributeEncode
?
Контекст этого вопроса с точки зрения желания не ломать мой сайт и, конечно же, предотвращения XSS.
ОБНОВЛЕНИЕ:
Я попытался протестировать вставку javascript в различные части URL-адреса, используя пользовательский ввод, который позже будет использоваться в атрибуте href
, и я заметил пару странностей.
В настоящее время я тестирую эту настройку кодирования:
content += "<a class=\"contentLink\" href=\"" + HttpUtility.HtmlEncode(HttpUtility.UrlPathEncode(subRow.linkHref)) + "\" target=\"_blank\">" + HttpUtility.HtmlEncode(subRow.linkText) + "</a>";
По сути, сначала я кодирую URL (с UrlPathEncode), затем я кодирую HTML. Я считаю, что это может быть правильный метод, поскольку закодированный HTML текст попадет в DOM и все равно должен нормально отображаться как URL-адрес (я думаю).
Однако, как я уже говорил, я заметил пару странностей.
- Я использовал это как пользовательский ввод:
http://localhost:10226/home.cshtml?javascript:var a = "hi"; alert(a); void(0);
и javascript не выполняется, но я не уверен, что это обязательно из-за моей кодировки (то есть я мог видеть, что продвинутые браузеры больше не позволяют запускать javascript из URL-адреса, поскольку это огромная дыра в безопасности и плохая практика, в общем, насколько я понимаю, но, конечно, я не могу на это рассчитывать). - После нажатия на ссылку, которая появляется с помощью этого тестового пользовательского ввода, адресная строка гласит:
http://localhost:10226/home.cshtml?javascript:var%20a%20=%20%22hi%22;%20alert(a);%20void(0);
И здесь я немного запутался. Из исследования, показанного в приведенных выше ссылках, предполагается, чтоUrlPathEncode
игнорирует кодировку после?
, однако вы можете ясно видеть, что он%
закодировал пробелы в части строки запроса этого URL. Я полагаю, это хорошо, но не соответствует тому, что я понимаю в документации.
Я полагаю, что все еще в недоумении, но все локальные и внешние ссылки, которые я пробовал, не были ни неработающими, ни опасными, насколько я могу судить, поэтому я буду продолжать использовать это до тех пор, пока мое понимание этого не прояснится.