Как мне закодировать атрибут href на моем сайте WebMatrix C#?

Во-первых, я много читал/исследовал эту тему, но я все еще немного сбит с толку относительно того, что для этого лучше всего.

Я проверил И ПРОЧИТАЛ ВСЕ следующие очень полезные и информативные страницы по этому вопросу:

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-адрес (я думаю).

Однако, как я уже говорил, я заметил пару странностей.

  1. Я использовал это как пользовательский ввод: http://localhost:10226/home.cshtml?javascript:var a = "hi"; alert(a); void(0); и javascript не выполняется, но я не уверен, что это обязательно из-за моей кодировки (то есть я мог видеть, что продвинутые браузеры больше не позволяют запускать javascript из URL-адреса, поскольку это огромная дыра в безопасности и плохая практика, в общем, насколько я понимаю, но, конечно, я не могу на это рассчитывать).
  2. После нажатия на ссылку, которая появляется с помощью этого тестового пользовательского ввода, адресная строка гласит: http://localhost:10226/home.cshtml?javascript:var%20a%20=%20%22hi%22;%20alert(a);%20void(0); И здесь я немного запутался. Из исследования, показанного в приведенных выше ссылках, предполагается, что UrlPathEncode игнорирует кодировку после ?, однако вы можете ясно видеть, что он % закодировал пробелы в части строки запроса этого URL. Я полагаю, это хорошо, но не соответствует тому, что я понимаю в документации.

Я полагаю, что все еще в недоумении, но все локальные и внешние ссылки, которые я пробовал, не были ни неработающими, ни опасными, насколько я могу судить, поэтому я буду продолжать использовать это до тех пор, пока мое понимание этого не прояснится.


person VoidKing    schedule 29.05.2013    source источник


Ответы (1)


Я не знаю, относится ли это к тому, что вы пытаетесь сделать, поскольку чтение вашего сообщения дало мне некоторый «паралич анализа», но я могу предложить другую точку зрения. Я стал полагаться на практику вызова функции java-скрипта, и это должно дать вам больше возможностей для построения строки URL-адреса. Это HTML:

         <a class="link_looks_like_button" onclick=openWin("../SendMail/ContractorInfo",700,850);>Add/Update Contractor</a>

Затем в моем Javascript:

   <script type="text/javascript">
    function openWin(url, width, height)
    {
        myWindow=window.open(url,'_blank','width='+width+',height='+height);
        myWindow.focus();
    }

Конечно, теперь, когда у вас есть это в java-скрипте, вы можете проверить свою строку «url» с помощью firebug и манипулировать ею с помощью java-скрипта.

Надеюсь, это поможет.

Вот ссылка на JSFiddle:http://jsfiddle.net/fonsecat/gzzzU/25/

person Thomas Fonseca    schedule 30.05.2013
comment
Я попытаюсь получить это в примере jsfiddle - person Thomas Fonseca; 30.05.2013
comment
Я ценю ваш вклад, и если бы я еще не использовал другие инструменты разработки, чтобы сказать, как на самом деле выглядит мой URL-адрес в реальном тексте, это было бы очень полезно. Тем не менее, мне нравится держать ВСЕ javascript (или сценарии ЛЮБОГО типа) вне DOM. Я никогда не использую onclick, onmouseover и т. д. Я настраиваю обработчики событий во внешнем файле javascript. Не уверен на 100%, что это всегда хорошая практика, но я где-то слышал, что лучше не вставлять javascript в DOM. В любом случае, я бы (как, вероятно, и другие) все равно хотел бы увидеть jsfiddle вашего кода, если бы вы были так склонны :) - person VoidKing; 30.05.2013
comment
Ты получил это! Я обновил ответ ссылкой на JSFiddle - person Thomas Fonseca; 30.05.2013
comment
Кажется, я вижу, что ты делаешь, но я не думаю, что это работает. Ничего не происходит, когда я нажимаю кнопку Sample. Я бы дал совет, но я очень редко (если вообще когда-либо) использовал Window.Open - person VoidKing; 31.05.2013