pi-lens
Version:
Real-time code feedback for pi — LSP, linters, formatters, type-checking, structural analysis & booboo
66 lines (51 loc) • 1.38 kB
YAML
# Dangerously Set Inner HTML
# Detects dangerouslySetInnerHTML usage (XSS risk)
id: dangerously-set-inner-html
name: Dangerously Set Inner HTML
severity: error
category: security
defect_class: injection
inline_tier: blocking
language: tsx
message: "dangerouslySetInnerHTML — XSS risk, sanitize user input"
description: |
dangerouslySetInnerHTML allows arbitrary HTML injection.
This is a major XSS vulnerability if user input is used.
✅ FIX: Sanitize HTML with a library like DOMPurify
```tsx
import DOMPurify from 'dompurify';
<div dangerouslySetInnerHTML={{
__html: DOMPurify.sanitize(userInput)
}} />
```
Or better, avoid using HTML altogether and use JSX.
query: |
(jsx_attribute
(property_identifier) @ATTR
(#match? @ATTR "dangerouslySetInnerHTML"))
metavars:
- ATTR
tags:
- security
- xss
- react
- jsx
examples:
bad: |
function Component({ userInput }) {
return <div dangerouslySetInnerHTML={{ __html: userInput }} />;
}
good: |
import DOMPurify from 'dompurify';
function Component({ userInput }) {
return (
<div dangerouslySetInnerHTML={{
__html: DOMPurify.sanitize(userInput)
}} />
);
}
// Or better:
function Component({ content }) {
return <div>{content}</div>; // Just use JSX
}
has_fix: false