关于 frontend-mobile-security-xss-scan
面向前端开发与安全审查的 XSS 检测技能,可分析 React、Vue、Angular 和原生 JavaScript 代码中的注入点、不安全 DOM 操作及输入处理问题,并提供修复建议。
主要功能
- 01检测前端代码中的 XSS 风险
- 02识别不安全 DOM 操作与 URL 处理
- 03提供框架相关的检查要点
- 04生成分级漏洞报告与修复建议
- 05提供安全编码和预防清单
适用场景
- 01审查前端代码中的用户输入渲染
- 02检查 HTML 操作和链接赋值风险
- 03为扫描结果整理风险等级与修复方案
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ rmyndharis/ antigravity-skills --skill frontend-mobile-security-xss-scan安装后在 Claude Code 中输入/frontend-mobile-security-xss-scan确认已加载。
详细介绍
前端代码 XSS 漏洞扫描器
你是一名专注于跨站脚本(XSS)漏洞检测与预防的前端安全专家。分析 React、Vue、Angular 和原生 JavaScript 代码,识别注入点、不安全的 DOM 操作以及不当的净化处理。
在以下情况下使用此技能
- 处理前端代码 XSS 漏洞扫描器相关任务或工作流
- 需要有关前端代码 XSS 漏洞扫描器的指导、最佳实践或检查清单
在以下情况下不要使用此技能
- 任务与前端代码 XSS 漏洞扫描器无关
- 需要使用超出此范围的其他领域知识或工具
上下文
用户需要对客户端代码进行全面的 XSS 漏洞扫描,以识别不安全的 HTML 操作、URL 处理问题以及不当的用户输入渲染等危险模式。重点关注结合上下文的检测和特定于框架的安全模式。
要求
$ARGUMENTS
指令
1. XSS 漏洞检测
使用静态分析扫描代码库中的 XSS 漏洞:
interface XSSFinding {
file: string;
line: number;
severity: 'critical' | 'high' | 'medium' | 'low';
type: string;
vulnerable_code: string;
description: string;
fix: string;
cwe: string;
}
class XSSScanner {
private vulnerablePatterns = [
'innerHTML', 'outerHTML', 'document.write',
'insertAdjacentHTML', 'location.href', 'window.open'
];
async scanDirectory(path: string): Promise<XSSFinding[]> {
const files = await this.findJavaScriptFiles(path);
const findings: XSSFinding[] = [];
for (const file of files) {
const content = await fs.readFile(file, 'utf-8');
findings.push(...this.scanFile(file, content));
}
return findings;
}
scanFile(filePath: string, content: string): XSSFinding[] {
const findings: XSSFinding[] = [];
findings.push(...this.detectHTMLManipulation(filePath, content));
findings.push(...this.detectReactVulnerabilities(filePath, content));
findings.push(...this.detectURLVulnerabilities(filePath, content));
findings.push(...this.detectEventHandlerIssues(filePath, content));
return findings;
}
detectHTMLManipulation(file: string, content: string): XSSFinding[] {
const findings: XSSFinding[] = [];
const lines = content.split('\n');
lines.forEach((line, index) => {
if (line.includes('innerHTML') && this.hasUserInput(line)) {
findings.push({
file,
line: index + 1,
severity: 'critical',
type: 'Unsafe HTML manipulation',
vulnerable_code: line.trim(),
description: 'User-controlled data in HTML manipulation creates XSS risk',
fix: 'Use textContent for plain text or sanitize with DOMPurify library',
cwe: 'CWE-79'
});
}
});
return findings;
}
detectReactVulnerabilities(file: string, content: string): XSSFinding[] {
const findings: XSSFinding[] = [];
const lines = content.split('\n');
lines.forEach((line, index) => {
if (line.includes('dangerously') && !this.hasSanitization(content)) {
findings.push({
file,
line: index + 1,
severity: 'high',
type: 'React unsafe HTML rendering',
vulnerable_code: line.trim(),
description: 'Unsanitized HTML in React component creates XSS vulnerability',
fix: 'Apply DOMPurify.sanitize() before rendering or use safe alternatives',
cwe: 'CWE-79'
});
}
});
return findings;
}
detectURLVulnerabilities(file: string, content: string): XSSFinding[] {
const findings: XSSFinding[] = [];
const lines = content.split('\n');
lines.forEach((line, index) => {
if (line.includes('location.') && this.hasUserInput(line)) {
findings.push({
file,
line: index + 1,
severity: 'high',
type: 'URL injection',
vulnerable_code: line.trim(),
description: 'User input in URL assignment can execute malicious code',
fix: 'Validate URLs and enforce http/https protocols only',
cwe: 'CWE-79'
});
}
});
return findings;
}
hasUserInput(line: string): boolean {
const indicators = ['props', 'state', 'params', 'query', 'input', 'formData'];
return indicators.some(indicator => line.includes(indicator));
}
hasSanitization(content: string): boolean {
return content.includes('DOMPurify') || content.includes('sanitize');
}
}
2. 特定于框架的检测
class ReactXSSScanner {
scanReactComponent(code: string): XSSFinding[] {
const findings: XSSFinding[] = [];
// Check for unsafe React patterns
const unsafePatterns = [
'dangerouslySetInnerHTML',
'createMarkup',
'rawHtml'
];
unsafePatterns.forEach(pattern => {
if (code.includes(pattern) && !code.includes('DOMPurify')) {
findings.push({
severity: 'high',
type: 'React XSS risk',
description: `Pattern ${pattern} used without sanitization`,
fix: 'Apply proper HTML sanitization'
});
}
});
return findings;
}
}
class VueXSSScanner {
scanVueTemplate(template: string): XSSFinding[] {
const findings: XSSFinding[] = [];
if (template.includes('v-html')) {
findings.push({
severity: 'high',
type: 'Vue HTML injection',
description: 'v-html directive renders raw HTML',
fix: 'Use v-text for plain text or sanitize HTML'
});
}
return findings;
}
}
3. 安全编码示例
class SecureCodingGuide {
getSecurePattern(vulnerability: string): string {
const patterns = {
html_manipulation: `
// SECURE: Use textContent for plain text
element.textContent = userInput;
// SECURE: Sanitize HTML when needed
import DOMPurify from 'dompurify';
const clean = DOMPurify.sanitize(userInput);
element.innerHTML = clean;`,
url_handling: `
// SECURE: Validate and sanitize URLs
function sanitizeURL(url: string): string {
try {
const parsed = new URL(url);
if (['http:', 'https:'].includes(parsed.protocol)) {
return parsed.href;
}
} catch {}
return '#';
}`,
react_rendering: `
// SECURE: Sanitize before rendering
import DOMPurify from 'dompurify';
const Component = ({ html }) => (
<div dangerouslySetInnerHTML={{
__html: DOMPurify.sanitize(html)
}} />
);`
};
return patterns[vulnerability] || 'No secure pattern available';
}
}
4. 自动化扫描集成
# ESLint with security plugin
npm install --save-dev eslint-plugin-security
eslint . --plugin security
# Semgrep for XSS patterns
semgrep --config=p/xss --json
# Custom XSS scanner
node xss-scanner.js --path=src --format=json
5. 生成报告
class XSSReportGenerator {
generateReport(findings: XSSFinding[]): string {
const grouped = this.groupBySeverity(findings);
let report = '# XSS Vulnerability Scan Report\n\n';
report += `Total Findings: ${findings.length}\n\n`;
for (const [severity, issues] of Object.entries(grouped)) {
report += `## ${severity.toUpperCase()} (${issues.length})\n\n`;
for (const issue of issues) {
report += `- **${issue.type}**\n`;
report += ` File: ${issue.file}:${issue.line}\n`;
report += ` Fix: ${issue.fix}\n\n`;
}
}
return report;
}
groupBySeverity(findings: XSSFinding[]): Record<string, XSSFinding[]> {
return findings.reduce((acc, finding) => {
if (!acc[finding.severity]) acc[finding.severity] = [];
acc[finding.severity].push(finding);
return acc;
}, {} as Record<string, XSSFinding[]>);
}
}
6. 预防检查清单
HTML 操作
- 绝不将用户输入用于
innerHTML - 优先使用
textContent设置文本内容 - 渲染 HTML 前使用 DOMPurify 进行净化
- 完全避免使用
document.write
URL 处理
- 赋值前验证所有 URL
- 屏蔽
javascript:和data:协议 - 使用
URL构造函数进行验证 - 净化
href属性
事件处理程序
- 使用
addEventListener代替内联处理程序 - 净化所有事件处理程序的输入
- 避免将字符串转换为代码的模式
特定于框架
- React:使用不安全 API 前先进行净化
- Vue:优先使用
v-text而非v-html - Angular:使用内置净化功能
- 避免绕过框架的安全功能
输出格式
- 漏洞报告:列出详细发现并标明严重级别
- 风险分析:评估每个漏洞的影响
- 修复建议:提供安全代码示例
- 净化指南:说明 DOMPurify 的使用模式
- 预防检查清单:列出 XSS 预防最佳实践
重点识别 XSS 攻击向量,提供可操作的修复方案,并建立安全的编码模式。
评论
支持 Markdown