После дня блужданий я наткнулся на этот ответ.
Похоже, это была напрасная трата времени, и мне нужно выбрать другой путь.
Когда я присваиваю elem.innerHTML значение <script>alert(1)</script>, оно становится неэкранированным: <script>alert(1)</script>. (Я замечаю это, когда ввожу это в редакторе: если ввести неэкранированный код, он исчезнет в предпросмотре.) Это проблема, или CSP это остановит?
https://meta.discourse.org/t/mitigate-xss-attacks-with-content-security-policy/104243!csp error|690x191
Посты, содержащие теги <script> в качестве части объяснения, также, похоже, вызывают эти ошибки CSP. Я сейчас в полном замешательстве. Нужно ли мне вообще беспокоиться о сохранённых XSS-атаках, или CSP просто заблокирует их? В редакторе я использую CKEditor, который предотвращает self-XSS. Если мне всё же нужно беспокоиться, похоже, мне нужно удалять небезопасные теги. В данный момент я делаю так:
value = Loofah.fragment(value).scrub!(:escape).to_s
Но, похоже, это не даёт никакого эффекта, потому что при присваивании этого значения elem.innerHTML HTML-сущности просто раскрываются.
РЕДАКТИРОВАНИЕ: Наконец, я нашёл источник своего замешательства: функция «Inspect Element» не показывает настоящий HTML — она уже преобразует HTML-сущности.
Если кликнуть «Edit as HTML» в инспекторе, становится ясно, что на самом деле всё в порядке. Тот факт, что рендерятся невидимые теги, должен был уже указать мне в этом направлении.
