Решение вопросов XSS

Назначив значение .className, вы переписываете каждый класс этого элемента.

Удалить класс:

blockSet[0].classList.remove('block-default');

Добавить новый класс:

blockSet[0].classList.add('block-selected');

Хороший момент для начала, когда вы пытаетесь сделать что-то, jQuery, как правило, для вас, http://youmightnotneedjquery.com/

0
задан user7654731 13 July 2018 в 20:37
поделиться

1 ответ

Основная проблема заключается в том, что пользователь управляет некоторыми данными, которые вы отображаете на странице небезопасным способом. Является ли это от их имени (мое имя - <script>function() { nasty stuff is happening here... }</script>) или любого другого контента.

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

  1. Пусть Razor сделает это, по умолчанию Razor обрабатывает кодировку всех HTML-символов на странице, это не применяется, если вы используете IHtmlString, поэтому избегайте этого Type (или методы, которые возвращают его как Html.Raw()), поэтому @("<script>nastyThings()</script>") является string, поэтому он будет закодирован, и скрипт не будет запущен
  2. . Если он сломан, это означает, что ваша строка имеет некоторый HTML / JS, которые вы на самом деле хотите отобразить. Поэтому попробуйте и переместите это прямо на шаблон Razor (HTML / JS) или получите его по ссылке (JS). Вместо того, чтобы весь string был управляемым пользователем "<element onclick="javascript:alert('trouble')"></element>" с шаблоном @Html.Raw(Model.UserBadString) Сделайте шаблон <element onclick="mySafeJsFunction()">@Model.UserSafeString</element> ", это берет на себя управление функцией JS от пользователя и оставляет их с закодированным Razor параметром, что они не могут выполнять XSS с
  3. . Вы хотите, чтобы Пользователь имел контроль над HTML, тогда у вас будет для дезинфекции строки на выходе на страницу, используя что-то вроде ( https://github.com/mganss/HtmlSanitizer ). Таким образом, шаблон может быть @Html.Raw(sanitizer.Sanitize(Model.UserBadString)), но вы, вероятно, захотите сделать что-то приятнее, хорошая практика кодирования и т. д. Главное, чтобы string был дезинфицирован

. В стороне, убедитесь, что вы держите очень близко к обычным свойствам, таким как .innerHTML в JS (или ужасный jQuery .html(), который вызывает eval()), как если бы они занимали контент с контролируемым пользователем, у вас будет такая же проблема. Но те же действия могут быть применены, (1) использовать .innerText, или (3) в противном случае использовать библиотеку очистки в строке, например DOMPurify, перед тем, как передать ее JS ( https://github.com/cure53/DOMPurify ). К сожалению, в этом случае вариант (2) не рекомендуется, так как все, что осталось, должно быть безопасно для вас или для меня, я бы скорее доверял DOMPurify, чтобы сделать это:)

0
ответ дан starlight54 17 August 2018 в 12:10
поделиться
Другие вопросы по тегам:

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