×
サイバー攻撃について
output.innerHTML = userInput;

改善例です。

output.textContent = userInput;

2. DOM APIで要素を組み立てる

危険な例です。

list.innerHTML += `<li>${username}</li>`;

改善例です。

const item = document.createElement("li");
item.textContent = username;
list.appendChild(item);

3. Djangoの自動エスケープを維持する

通常の表示です。

<p>{{ message.body }}</p>

利用者入力へ安易に次を使用しないでください。

<p>{{ message.body|safe }}</p>

Djangoテンプレートは多くのXSSを自動エスケープしますが、属性の引用符不足やsafeの使用など、保護範囲外の構成があります。


4. HTMLを許可する場合は専用サニタイザーを使う

コメント装飾やリッチテキストなど、HTMLが必要な場合は次の方式を取ります。

入力
 ↓
許可する要素・属性を定義
 ↓
保守されたHTMLサニタイザー
 ↓
サニタイズ済みHTMLとして保存または表示

ブラックリスト方式ではなく、許可リスト方式を基本にします。

不要なら次を許可しません。