≪ Today I learned.
RSS購読
    公開日
    更新日
    タグ
    JavaScript
    著者
    ダーシノ

    innerHTMLの代わりにElement#setHTMLUnsafe()

    Chrome 105からのExperimentalな機能としてElement#setHTML()が提供された。

    ※2025-01-06現在は、Element#setHTMLUnsafe()に変わっている。

    昨今、ReactやVueなどのJavaScriptライブラリ/フレームワークを使う事が多いので、文字列をそのままHTMLとして扱うことはほとんどないと思う。ただし、レガシーなシステムでは今でも危険な実装が残っているかもしれないため、注意が必要だ。

    innerHTMLでXSSを踏んじゃうコード

    const input = `<p><script>alert('xss')</scritp></p>`
    document.querySelector('...').innerHTML = input

    setHTMLでサニタイズ

    2025-01-06現在は、Element#setHTMLUnsafe()としてサポートされたため、setHTML()は使えない。

    const input = `<p><script>alert('xss')</scritp></p>`
    const sanitizer = new Sanitizer()
    
    document.querySelector('...').setHTML(input, sanitizer)

    Element#setHTMLUnsafe()を使う

    const input = `<p><script>alert('xss')</scritp></p>`
    
    document.querySelector('...').setHTMLUnsafe(input)