≪ Today I learned. RSS購読
公開日
更新日
タグ
Security
著者
ダーシノ(@bc_rikko)

「サニタイズ言うなキャンペーン」から技術書の正しい書き方を理解する

SNSを見ていたら「サニタイズ言うなキャンペーン」が2000年代に行われていたことを知る。高木さんの記事を読んでみても、当時の状況を知らない私にとってはいまいちピンとこなかったので、思考をまとめる意味でも書き出してみる。

「サニタイズ言うなキャンペーン」関連記事

「サニタイズ言うなキャンペーン」の文脈

悪い書籍の例: 文字を表示しよう

文字の表示にはHTMLElement.innerHTMLを使います。

const p = document.querySelector('p')
p.innerHTML = 'この文字列には<script>alert("危険")</script>だよ'

しかし、上記のように実装すると、alert("危険")が実行されてしまいます。なので、サニタイズしましょう

const p = document.querySelector('p')
p.innerHTML = encodeURIComponent('この文字列には<script>alert("危険")</script>だよ')

これで安心ですね。

「サニタイズ言うなキャンペーン」の主張

たぶん良い書籍の例: 文字を表示しよう

文字の表示にはHTMLElement.textContentを使います。

const p = document.querySelector('p')
p.textContent = 'この文字列には<script>alert("危険")</script>だよ'

「この文字列には<script>alert("危険")</script>だよ」という文字が表示されましたね。

まとめ

「サニタイズ」という言葉を使うために脆弱性を生み出している。

ゆえに「サニタイズ言うな」である。


追記: 2024-12-05

同僚に「サニタイズ言うなキャンペーン」ってなんですか?と聞いたところ、的確な回答をもらえた。

A氏の回答

当時、「サニタイズ」という言葉が、人によって何を指すか違った。そういった背景もあり、曖昧な「サニタイズ」という言葉に対する批判的な文脈があった。

現代においては、わざわざエスケープせずとも安全に処理する方法があるならば、まずそれを選択するのが大前提になる。(HTMLならHTMLElement#textContent、SQLなら文字連結せずプレースホルダーを使ってバインドするなど) そういった対策ができない場合に、出力先コンテキストに応じたエスケープ処理が必要。くわえて、すべての箇所で一貫して実施することが望まれる。

B氏の回答

自分の見れる範囲で「とりうる値」がわかるからといって、バリデーションやエスケープ処理をしなくて良い理由にはならない。「出力先がどのような場所かを考慮した表示処理をする」のが大事。