Skip to content

noDangerouslySetInnerHtml (JavaScript)

Language JavaScript (and super languages)
biome.json
{
"linter": {
"rules": {
"security": {
"noDangerouslySetInnerHtml": "error"
}
}
}
}

Disallow React’s dangerouslySetInnerHTML property.

This property inserts HTML directly and bypasses React’s normal escaping. If the HTML contains untrusted data, attackers can inject code through a cross-site scripting (XSS) vulnerability. Prefer rendering content as JSX children.

function createMarkup() {
return { __html: "child" };
}
<div dangerouslySetInnerHTML={createMarkup()} />;
code-block.jsx:4:6 lint/security/noDangerouslySetInnerHtml ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

✖ Avoid passing content using the dangerouslySetInnerHTML prop.

2 │ return { __html: "child" };
3 │ }
> 4 │ <div dangerouslySetInnerHTML={createMarkup()} />;
│ ^^^^^^^^^^^^^^^^^^^^^^^
5 │

⚠ Setting content using code can expose users to cross-site scripting (XSS) attacks

React.createElement("div", {
dangerouslySetInnerHTML: { __html: "child" },
});
code-block.js:2:5 lint/security/noDangerouslySetInnerHtml ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

✖ Avoid passing content using the dangerouslySetInnerHTML prop.

1 │ React.createElement("div", {
> 2 │ dangerouslySetInnerHTML: { __html: "child" },
│ ^^^^^^^^^^^^^^^^^^^^^^^
3 │ });
4 │

⚠ Setting content using code can expose users to cross-site scripting (XSS) attacks

function Message({ text }) {
return <div>{text}</div>;
}