mcpField
F
frontend-mobile-security-xss-scan

frontend-mobile-security-xss-scan

github.com/rmyndharis安全1.9k39 次安装2 周前更新
代码仓库

关于 frontend-mobile-security-xss-scan

面向前端开发与安全审查的 XSS 检测技能,可分析 React、Vue、Angular 和原生 JavaScript 代码中的注入点、不安全 DOM 操作及输入处理问题,并提供修复建议。

主要功能

  1. 01检测前端代码中的 XSS 风险
  2. 02识别不安全 DOM 操作与 URL 处理
  3. 03提供框架相关的检查要点
  4. 04生成分级漏洞报告与修复建议
  5. 05提供安全编码和预防清单

适用场景

  1. 01审查前端代码中的用户输入渲染
  2. 02检查 HTML 操作和链接赋值风险
  3. 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:使用内置净化功能
  • 避免绕过框架的安全功能

输出格式

  1. 漏洞报告:列出详细发现并标明严重级别
  2. 风险分析:评估每个漏洞的影响
  3. 修复建议:提供安全代码示例
  4. 净化指南:说明 DOMPurify 的使用模式
  5. 预防检查清单:列出 XSS 预防最佳实践

重点识别 XSS 攻击向量,提供可操作的修复方案,并建立安全的编码模式。

评论

支持 Markdown