Назначив значение .className
, вы переписываете каждый класс этого элемента.
Удалить класс:
blockSet[0].classList.remove('block-default');
Добавить новый класс:
blockSet[0].classList.add('block-selected');
Хороший момент для начала, когда вы пытаетесь сделать что-то, jQuery, как правило, для вас, http://youmightnotneedjquery.com/
Основная проблема заключается в том, что пользователь управляет некоторыми данными, которые вы отображаете на странице небезопасным способом. Является ли это от их имени (мое имя - <script>function() { nasty stuff is happening here... }</script>
) или любого другого контента.
Я использую следующий подход, смотрю на ваш результат (или лучше задумываюсь об этом) и вижу, на каждом этапе:
IHtmlString
, поэтому избегайте этого Type
(или методы, которые возвращают его как Html.Raw()
), поэтому @("<script>nastyThings()</script>")
является string
, поэтому он будет закодирован, и скрипт не будет запущен string
был управляемым пользователем "<element onclick="javascript:alert('trouble')"></element>"
с шаблоном @Html.Raw(Model.UserBadString)
Сделайте шаблон <element onclick="mySafeJsFunction()">@Model.UserSafeString</element>
", это берет на себя управление функцией JS от пользователя и оставляет их с закодированным Razor параметром, что они не могут выполнять XSS с @Html.Raw(sanitizer.Sanitize(Model.UserBadString))
, но вы, вероятно, захотите сделать что-то приятнее, хорошая практика кодирования и т. д. Главное, чтобы string
был дезинфицирован . В стороне, убедитесь, что вы держите очень близко к обычным свойствам, таким как .innerHTML
в JS (или ужасный jQuery .html()
, который вызывает eval()
), как если бы они занимали контент с контролируемым пользователем, у вас будет такая же проблема. Но те же действия могут быть применены, (1) использовать .innerText
, или (3) в противном случае использовать библиотеку очистки в строке, например DOMPurify, перед тем, как передать ее JS ( https://github.com/cure53/DOMPurify ). К сожалению, в этом случае вариант (2) не рекомендуется, так как все, что осталось, должно быть безопасно для вас или для меня, я бы скорее доверял DOMPurify, чтобы сделать это:)