Самое простое — всегда экранировать ввод перед выводом. innerHTML с пользовательскими данными — прям путь к проблемам. Лучше использовать textContent или проверенные библиотеки типа DOMPurify. CSP — не панацея, но прикрывает хвосты, если что просочится. И да, регулярно проверять через OWASP ZAP не помешает. Так хоть базу подстрахуешь, чтоб не горело потом.