Skip to main content
interlace
Plugin: react-featuresRules

jsx-no-target-blank

Require rel='noopener noreferrer' with target='_blank'. This rule is part of eslint-plugin-react-features and provides LLM-optimized error messages.

Require rel="noopener noreferrer" with target="_blank". This rule is part of eslint-plugin-react-features and provides LLM-optimized error messages.

Quick Summary

AspectDetails
SeverityWarning (security)
Auto-Fix💡 Suggests fixes
CategoryReact Security
ESLint MCP✅ Optimized for ESLint MCP integration
Best ForAll React/JSX projects

Rule Details

Links with target="_blank" without rel="noopener noreferrer" are vulnerable to tabnabbing attacks.

Examples

❌ Incorrect

<a target="_blank" href="https://example.com">Link</a>

<a target="_blank" href={url}>External</a>

✅ Correct

<a target="_blank" rel="noopener noreferrer" href="https://example.com">Link</a>

<a target="_blank" rel="noopener" href="https://example.com">Link</a>

What is checked

An <a> whose target is _blank (any letter case, plain or braced) and whose href is external (http:// / https:// in any letter case, or protocol-relative //host, plain or braced) is reported unless rel contains noopener or noreferrer (tokens read case-insensitively, plain or braced). noopener alone is enough.

Options

OptionTypeDefaultDescription
allowReferrerbooleanfalseOnly changes the autofix: add noopener instead of noopener noreferrer
enforceDynamicLinks'always' | 'never''always''always' treats a dynamic href as external and a dynamic target as _blank; 'never' leaves them unjudged
warnOnSpreadAttributesbooleanfalseBy default an element with a spread is skipped (the spread may carry rel)
linksbooleantrueCheck <a> elements
formsbooleanfalseAlso check <form target="_blank">

Use this rule

npm install -D oxlint-plugin-react-features
.oxlintrc.json
{  "jsPlugins": ["oxlint-plugin-react-features"],  "rules": {    "react-features/jsx-no-target-blank": "error"  }}
vite.config.ts
import { defineConfig } from 'vite-plus';export default defineConfig({  lint: {    jsPlugins: ['oxlint-plugin-react-features'],    rules: {      'react-features/jsx-no-target-blank': 'error',    },  },});

oxlint-plugin-react-features re-exports eslint-plugin-react-features/oxlint: the same rules under the same IDs, and no ESLint install. Why oxlint.

Did this rule catch something? Star the repo to get new CWE coverage as we ship it — or follow the AI-code-security benchmarks behind these rules.