mcpField
F
frontend-mobile-security-xss-scan

frontend-mobile-security-xss-scan

github.com/sickn33安全48.7k468 次安装今天更新
代码仓库

关于 frontend-mobile-security-xss-scan

面向前端安全审查的技能,可帮助检查 React、Vue、Angular 和原生 JavaScript 中潜在的 XSS 路径。它结合框架特定检查与修复建议,并要求追踪不可信数据到实际输出点,避免把模式匹配直接视为漏洞。

主要功能

  1. 01检查前端 XSS 候选项
  2. 02检查框架特定模式
  3. 03追踪数据至渲染输出点
  4. 04提供安全编码模式
  5. 05按严重程度整理发现

适用场景

  1. 01审查客户端代码中的 XSS 风险
  2. 02评估不安全的 HTML 与 URL 处理
  3. 03整理可执行的扫描发现
  4. 04应用框架适配的预防建议

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/sickn33/agentic-awesome-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-scanner.js 未包含在内。字符串匹配只能找出待审查项,不能证明存在可利用的漏洞;请追踪攻击者可控数据到其接收点及上下文的流转,包括数据转换过程。在文件其他位置导入净化器,并不能证明接收点已净化。记录检查范围、误报和缺失的数据流;根据已证实的可达性和影响确定严重程度。仅在获得授权的本地或测试环境中测试有效载荷,切勿窃取真实用户的数据。

使用静态分析扫描代码库中的 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('dangerouslySetInnerHTML')) {
        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)) {
        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:使用内置净化功能
  • 避免绕过框架安全功能

输出格式

URL 协议允许列表只能阻止部分脚本协议,无法防止开放重定向或授权失效;需要导航时,请强制限定为获准的源。HTML 净化必须在实际接收点执行,并确保之后仍保持净化状态;请及时更新 DOMPurify 及任何服务端 DOM 实现。启发式扫描未发现问题,并不能证明不存在 XSS。

  1. 漏洞报告:包含详细发现项及严重程度
  2. 风险分析:评估每个漏洞的影响
  3. 修复建议:提供安全代码示例
  4. 净化指南:介绍 DOMPurify 的使用模式
  5. 预防检查清单:XSS 预防最佳实践

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

限制

  • 仅当任务明确符合上述范围时,才使用此技能。
  • 请勿将输出视为针对特定环境进行验证、测试或专家审查的替代方案。
  • 如果缺少必要的输入、权限、安全边界或成功标准,请停止并请求澄清。

评论

支持 Markdown