如何防止触发 HTML 属性中的事件处理程序?

How to prevent event handlers in HTML attributes from firing?

我最近了解到,浏览器只要在元素上设置内容,就会触发 details 元素的 toggle 事件,即使它不在 DOM 中也是如此。以下执行警报:

document.createElement('p').innerHTML = "<details open ontoggle=\"alert('BAD')\">"

同样适用于图像及其 onload 事件。

将此与使用 script 标签进行比较。以下不执行任何操作:

document.createElement('p').innerHTML = "<script>alert('FINE')</script>"

已在 Chrome 和 Firefox 中测试。

有没有办法像这样抑制内联事件处理程序的执行?理想情况下可以在父元素上设置的东西

我考虑过在父级上添加一个事件处理程序,但是 toggle event 没有冒泡!

一个明显的解决方案是清理 html 源,但我正在寻找比字符串操作更优雅和防弹的东西。

答案是Content-Security-Policy。根本不允许 unsafe-inline.