output.innerHTML = userInput;
改善例です。
output.textContent = userInput;
危険な例です。
list.innerHTML += `<li>${username}</li>`;
改善例です。
const item = document.createElement("li");
item.textContent = username;
list.appendChild(item);
通常の表示です。
<p>{{ message.body }}</p>
利用者入力へ安易に次を使用しないでください。
<p>{{ message.body|safe }}</p>
Djangoテンプレートは多くのXSSを自動エスケープしますが、属性の引用符不足やsafeの使用など、保護範囲外の構成があります。
コメント装飾やリッチテキストなど、HTMLが必要な場合は次の方式を取ります。
入力
↓
許可する要素・属性を定義
↓
保守されたHTMLサニタイザー
↓
サニタイズ済みHTMLとして保存または表示
ブラックリスト方式ではなく、許可リスト方式を基本にします。
不要なら次を許可しません。