跳转到正文
报告库
用途分类 / 浏览器操作

E2e Testing Patterns Skill 安全审计

作者说它能做什么(原文)

Master end-to-end testing with Playwright and Cypress to build reliable test suites that catch bugs, improve confidence, and enable fast deployment. Use when implementing E2E tests, debugging flaky tests, or establishing testing standards.

第三方安全检查结论

发现安全风险

已检查文件
2
发现的风险
4
会不会运行危险命令?检查是否下载程序后直接运行、让他人远程控制电脑,或藏起要运行的命令。发现 1 项风险
中风险

未固定版本的 npx 和 npm 示例可能获取并运行当前解析到的包

原文依据:2 处
发现了什么

Skill 建议直接运行 npx playwright,并给出没有版本号的 npm install。若本地没有锁定依赖,包管理器可能从配置的软件源解析、下载并执行当时可用的包代码。

为什么需要注意

软件源、包名解析或最新版本若被破坏或出现恶意变更,安装脚本或测试工具会以运行命令的用户权限执行,并可访问测试工作区与其环境变量。

这些都是文档中的手动示例,不会由 Skill 自动执行。不过两条 npx 命令未指定版本;当本地缺少 Playwright 且 npx 允许自动获取时,可能从配置的软件源下载并运行解析到的包。另一个 npm install 示例也未固定 `@axe-core/playwright` 版本,安装结果会随解析时间、注册表和锁文件而变化,并可能触发依赖安装脚本。用户可要求锁文件、完整版本和受信任的软件源。

SKILL.md:101来自说明文档打开原文件
```typescript// Playwright debugging// 1. Run in headed modenpx playwright test --headed// 2. Run in debug modenpx playwright test --debug
查看另外 1 个位置
references/details.md:389来自说明文档打开原文件
### Pattern 3: Accessibility Testing```typescript// Install: npm install @axe-core/playwrightimport { test, expect } from "@playwright/test";import AxeBuilder from "@axe-core/playwright";
会不会泄露文件和密钥?检查是否发送含密码或密钥的文件,以及代码里是否直接写了密钥。发现 1 项风险
中风险

失败诊断产物可能保存登录信息、会话内容或个人数据

原文依据:4 处
发现了什么

配置会在重试或失败时保留跟踪、截图和视频,调试示例还会直接写出媒体文件。端到端测试同时会把电子邮件和密码输入真实浏览器页面,因此这些产物可能记录敏感页面状态。

为什么需要注意

如果 CI 产物、工作区或测试报告可被不适当的人员访问,用户凭据、会话令牌、账户数据或页面中的个人信息可能被披露。

参考配置会在首次重试时记录 trace,并在失败时保留截图和视频;另一调试示例还会把截图和视频写入文件。登录示例把电子邮件和密码填入浏览器页面,因此当记录发生在认证流程或已登录页面时,产物可能包含凭据字段、会话页面或个人数据。是否实际泄露取决于测试页面和产物存储权限。用户可要求遮蔽敏感字段、缩短保留期并限制 CI 产物访问。

references/details.md:21来自说明文档打开原文件
  workers: process.env.CI ? 1 : undefined,  reporter: [["html"], ["junit", { outputFile: "results.xml" }]],  use: {    baseURL: "http://localhost:3000",    trace: "on-first-retry",    screenshot: "only-on-failure",    video: "retain-on-failure",  },
查看另外 3 个位置
references/details.md:62来自说明文档打开原文件
  async login(email: string, password: string) {    await this.emailInput.fill(email);    await this.passwordInput.fill(password);    await this.loginButton.click();  }
SKILL.md:108来自说明文档打开原文件
// 3. Use trace viewerawait page.screenshot({ path: 'screenshot.png' });await page.video()?.saveAs('video.webm');
references/details.md:24来自说明文档打开原文件
    baseURL: "http://localhost:3000",    trace: "on-first-retry",    screenshot: "only-on-failure",    video: "retain-on-failure",  },
会不会删除文件或一直在后台运行?检查是否大范围删除文件、改写磁盘,或设置自动启动。未发现风险
会不会绕过安全保护?检查是否跳过网站安全验证、开放过多文件权限,或取消操作前的确认。发现 2 项风险
中风险

示例会把普通 API 请求改成管理员角色并转发

原文依据:2 处
发现了什么

参考代码并非只模拟响应;它截获用户 API 请求,把 role 设置为 admin,再通过 route.continue 将修改后的请求发送给后端。虽然这是测试示例,但复制后会实际改变发出的请求。

为什么需要注意

若测试误连共享、预发布或生产后端,且后端错误地信任客户端角色字段,可能创建或修改高权限账户,影响账户权限和数据完整性。

这是“网络模拟和拦截”章节中的测试示例,不是 Skill 自动执行的隐藏行为;但若用户原样采用并运行,它会拦截匹配 `/api/users` 的请求,把 `role` 改成 `admin`,然后通过 `route.continue` 将修改后的请求继续发送。若对真实或高权限后端运行,可能越权创建或修改管理员数据。用户可要求仅允许测试环境、模拟后端和低权限测试账号,并验证服务端仍执行授权检查。

references/details.md:203来自说明文档打开原文件
// Intercept and modify requeststest("can modify API request", async ({ page }) => {  await page.route("**/api/users", async (route) => {    const request = route.request();    const postData = JSON.parse(request.postData() || "{}");    // Modify request    postData.role = "admin";    await route.continue({      postData: JSON.stringify(postData),    });  });
查看另外 1 个位置
references/details.md:186来自说明文档打开原文件
### Pattern 4: Network Mocking and Interception```typescript// Mock API responsestest("displays error when API fails", async ({ page }) => {  await page.route("**/api/users", (route) => {
低风险

安装命令没有固定依赖版本

原文依据:4 处
发现了什么

安装命令没有指定依赖版本。同样的命令以后可能下载不同代码,你实际安装的内容可能与这次检查时不同。

为什么需要注意

即使命令和报告没变,以后安装时也可能下载到另一份代码。

这段证据能说明什么

这是手动运行 Playwright 测试的调试示例,不是明确的安装命令,也不会由 Skill 自动执行。若项目已安装并锁定 Playwright,npx 通常使用本地版本;若未安装,其是否联网获取包取决于 npx/npm 的版本、配置和交互确认。仅凭该行无法确定会安装未固定版本。用户可要求使用锁文件、本地脚本或明确版本,并禁止 npx 自动安装。

这项判断针对展示的代码和适用条件,不表示风险已经实际发生。
这段证据能说明什么

该行是供用户手动启动调试模式的 npx 命令,并非明确的依赖安装步骤。它可能运行项目中已锁定的本地 Playwright;只有在包缺失且当前 npx 配置允许获取包时,才可能解析并下载未指定版本。因此存在条件性供应链风险,但候选所称“安装命令”未由源码直接证明。用户可要求只运行锁定的本地二进制。

这项判断针对展示的代码和适用条件,不表示风险已经实际发生。
SKILL.md:103来自说明文档打开原文件
// 1. Run in headed modenpx playwright test --headed
查看另外 3 个位置
SKILL.md:101来自说明文档打开原文件
```typescript// Playwright debugging// 1. Run in headed modenpx playwright test --headed
SKILL.md:106来自说明文档打开原文件
// 2. Run in debug modenpx playwright test --debug
SKILL.md:105来自说明文档打开原文件
// 2. Run in debug modenpx playwright test --debug
会不会误导 AI 或隐藏内容?检查工作说明是否要求 AI 忽略你的指令、干扰检查结果,或夹带看不见的文字。未发现风险
会不会偷偷改推广链接或收款方?检查是否强制替换推广链接或收款对象,同时要求隐瞒更改。未发现风险

Skill 逻辑拆解

6 个说明模块

该 Skill 是 Playwright 和 Cypress 端到端测试的指导文档;主文件把详细配置、测试夹具、网络拦截和辅助功能测试引导到参考文件。

查看原文
SKILL.md:62来自说明文档打开原文件
## Detailed patterns and worked examplesDetailed pattern documentation lives in `references/details.md`. Read that file when the navigation tier above is insufficient.

示例会创建并删除数据库测试用户,并把环境变量中的管理员密码提供给测试夹具。创建、删除函数的实现未在所提供文件中出现。

查看原文
references/details.md:114来自说明文档打开原文件
export const test = base.extend<TestData>({  testUser: async ({}, use) => {    const user = {      email: `test-${Date.now()}@example.com`,      password: "Test123!@#",      name: "Test User",    };    // Setup: Create user in database    await createTestUser(user);    await use(user);    // Teardown: Clean up user    await deleteTestUser(user.email);  },
references/details.md:128来自说明文档打开原文件
  adminUser: async ({}, use) => {    await use({      email: "admin@example.com",      password: process.env.ADMIN_PASSWORD!,    });  },

Playwright 配置默认针对本机站点,并在重试或失败时生成跟踪、截图和视频;调试示例也会显式保存截图和视频。

查看原文
references/details.md:21来自说明文档打开原文件
  workers: process.env.CI ? 1 : undefined,  reporter: [["html"], ["junit", { outputFile: "results.xml" }]],  use: {    baseURL: "http://localhost:3000",    trace: "on-first-retry",    screenshot: "only-on-failure",    video: "retain-on-failure",  },
SKILL.md:108来自说明文档打开原文件
// 3. Use trace viewerawait page.screenshot({ path: 'screenshot.png' });await page.video()?.saveAs('video.webm');

网络拦截示例既包括完全模拟响应,也包括修改请求后继续发送给目标应用;其中一个示例把请求角色改为管理员。

查看原文
references/details.md:203来自说明文档打开原文件
// Intercept and modify requeststest("can modify API request", async ({ page }) => {  await page.route("**/api/users", async (route) => {    const request = route.request();    const postData = JSON.parse(request.postData() || "{}");    // Modify request    postData.role = "admin";    await route.continue({      postData: JSON.stringify(postData),    });  });
从这里开始 · 工作说明SKILL.md
e2e-testing-patterns
连线表示工作说明包含的模块,不是实际运行顺序。点击模块可查看原文。

文件引用关系图

1 处引用
哪些文件发起引用引用了什么
连线表示真实的文件引用,不是运行顺序。点击节点可高亮相关连线,并查看具体文件和原文位置。虚线表示还有文件需要定位。
文件与检查记录2 个文件

检查范围与遗漏

逐文件查看涉及的内容

下方列出本次涉及的原文范围;纳入检查不代表已查清所有问题。

  • SKILL.md已纳入全文
  • references/details.md已纳入全文

这份报告只针对上方版本。我们看了拿到的代码和说明文件,没有实际运行 Skill,也没有检查它另外安装的软件包。因此,这不是“保证安全”的承诺;换了版本或使用环境,结果也可能不同。

  • SKILL.md工作说明
  • references/details.md配套文件

代码和说明中提到的操作

读取文件
SKILL.md:64来自说明文档打开原文件
Detailed pattern documentation lives in `references/details.md`. Read that file when the navigation tier above is insufficient.
安装其他软件包
SKILL.md:103来自说明文档打开原文件
// 1. Run in headed modenpx playwright test --headed
SKILL.md:106来自说明文档打开原文件
// 2. Run in debug modenpx playwright test --debug
references/details.md:385来自说明文档打开原文件
// Run in CI// npx playwright test --shard=1/4// npx playwright test --shard=2/4
读取密钥或账号配置
references/details.md:18来自说明文档打开原文件
  fullyParallel: true,  forbidOnly: !!process.env.CI,  retries: process.env.CI ? 2 : 0,
references/details.md:19来自说明文档打开原文件
  forbidOnly: !!process.env.CI,  retries: process.env.CI ? 2 : 0,  workers: process.env.CI ? 1 : undefined,
references/details.md:20来自说明文档打开原文件
  retries: process.env.CI ? 2 : 0,  workers: process.env.CI ? 1 : undefined,  reporter: [["html"], ["junit", { outputFile: "results.xml" }]],
连接外部网站
references/details.md:23来自说明文档打开原文件
  use: {    baseURL: "http://localhost:3000",    trace: "on-first-retry",
references/details.md:246来自说明文档打开原文件
  e2e: {    baseUrl: "http://localhost:3000",    viewportWidth: 1280,
读取了多少行
542
文件校验值(用于核对版本)
dc201a9e2c11ba69da637add5dfe0c79958e656150d36401277415949df960c9