plugins/languages/javascript/skills/security/SKILL.md
JavaScript Web安全规范:XSS跨站脚本防护、CSP内容安全策略、CORS跨域配置、Zod运行时输入验证、npm依赖安全审计。处理安全漏洞修复、输入校验、权限控制、安全加固时加载。
npx skillsauth add lazygophers/ccplugin plugins/languages/javascript/skills/securityInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
| Agent | 说明 | | ----- | ---- | | dev | JavaScript 开发专家 | | debug | JavaScript 调试专家 |
| 场景 | Skill | 说明 | |------|-------|------| | 核心规范 | Skills(javascript:core) | ES2025-2026 标准、ESM、工具链 | | 异步编程 | Skills(javascript:async) | async/await、AbortController |
// DOMPurify 清理 HTML(必须用于任何用户输入的 HTML)
import DOMPurify from 'dompurify';
const clean = DOMPurify.sanitize(userInput);
element.innerHTML = clean;
// textContent 替代 innerHTML(纯文本场景)
element.textContent = userInput; // 自动转义
// React 自动转义(安全)
<div>{userInput}</div>
// React dangerouslySetInnerHTML(必须先清理)
<div dangerouslySetInnerHTML={{ __html: DOMPurify.sanitize(userInput) }} />
// 禁止:直接设置用户输入
element.innerHTML = userInput; // XSS 漏洞
import { z } from 'zod';
// API 响应验证
const UserSchema = z.object({
id: z.string().uuid(),
name: z.string().min(1).max(100),
email: z.string().email(),
role: z.enum(['admin', 'user', 'guest']),
});
async function fetchUser(id) {
const response = await fetch(`/api/users/${id}`);
const data = await response.json();
return UserSchema.parse(data); // 运行时验证,无效数据抛出异常
}
// 表单输入验证
const LoginSchema = z.object({
email: z.string().email('Invalid email'),
password: z.string().min(8, 'At least 8 characters'),
});
function handleSubmit(formData) {
const result = LoginSchema.safeParse(formData);
if (!result.success) {
return { errors: result.error.flatten().fieldErrors };
}
return login(result.data);
}
// 环境变量验证
const EnvSchema = z.object({
API_URL: z.string().url(),
API_KEY: z.string().min(1),
NODE_ENV: z.enum(['development', 'production', 'test']),
});
const env = EnvSchema.parse(process.env);
// HTTP 头配置(推荐)
// Content-Security-Policy: default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' data: https:;
// Meta 标签配置
<meta http-equiv="Content-Security-Policy" content="
default-src 'self';
script-src 'self';
style-src 'self' 'unsafe-inline';
img-src 'self' data: https:;
connect-src 'self' https://api.example.com;
font-src 'self' https://fonts.gstatic.com;
">
// Vite 开发服务器 CSP
// vite.config.js
export default {
server: {
headers: {
'Content-Security-Policy': "default-src 'self'; script-src 'self' 'unsafe-eval';"
}
}
};
// Vite 代理(开发环境)
export default {
server: {
proxy: {
'/api': {
target: 'https://api.example.com',
changeOrigin: true,
rewrite: (path) => path.replace(/^\/api/, ''),
}
}
}
};
// Express CORS 配置(生产环境)
import cors from 'cors';
app.use(cors({
origin: ['https://example.com', 'https://app.example.com'],
methods: ['GET', 'POST', 'PUT', 'DELETE'],
credentials: true,
maxAge: 86400, // 预检请求缓存 24h
}));
# pnpm 安全审计
pnpm audit
pnpm audit --fix
# npm 安全审计
npm audit
npm audit fix
# 自动化:CI 中集成审计
# .github/workflows/audit.yml
# - run: pnpm audit --audit-level=high
// CSRF 防护:SameSite Cookie
document.cookie = 'session=abc; SameSite=Strict; Secure; HttpOnly';
// 敏感数据不存 localStorage
// 使用 httpOnly cookie 存储 token
// URL 参数验证
const url = new URL(userProvidedUrl);
if (!['http:', 'https:'].includes(url.protocol)) {
throw new Error('Invalid protocol');
}
// 避免 eval 和 Function 构造器
// eval(userInput); // 禁止
// new Function(userInput); // 禁止
| 现象 | 问题 | 严重程度 |
|------|------|---------|
| innerHTML = userInput | XSS 漏洞 | 高 |
| 无 Zod 验证 API 响应 | 不可信数据直接使用 | 高 |
| 无 CSP 头 | 缺少内容安全策略 | 中 |
| eval() / new Function() | 代码注入风险 | 高 |
| token 存 localStorage | 应使用 httpOnly cookie | 中 |
| 无 CORS 限制 | origin: '*' 允许任意来源 | 中 |
| 无依赖审计 | 可能包含已知漏洞 | 中 |
eval() 或 new Function()pnpm audit 依赖审计tools
UI/UX 与布局设计——做界面布局/结构/导航/组件/交互的设计决策。触发:做UI/UX/布局/排版/导航/组件/交互/栅格/响应式/图表选型/字体配对。按媒介路由 HTML/Web、原生 App(iOS/Android/桌面)、CLI、TUI。需后端动态系统不适用;配色/主题/色板走姊妹 skill design-color。
tools
主题与配色设计——做颜色搭配/调色板/主题/品牌色阶/暗模式的设计决策。触发:选配色/调色/主题/色板/品牌色/暗模式/对比度/色盲/UI风格。按媒介路由 HTML/Web(CSS变量)、原生App(平台token)、CLI(ANSI)、TUI(真彩/256/16降级)。保证可访问性(对比度/色盲安全)。需后端动态系统不适用;UI/UX 布局/组件/交互走姊妹 skill design-uiux。
tools
跨任意组件(plugin/skill/agent/command)的验证驱动优化循环纪律 skill。当用户要优化某个已有组件却无明确方向、或要防止改了反而更差(自评乐观偏差 / 多维同改归因失效 / 为凑分加废话膨胀)、或要把一套通用「评分→单变量改→改后验证严格更好才留否则回滚→触顶停」的纪律套到任意组件上时使用。管优化过程本身的纪律(validation gate / ratchet / 独立验证 / 触顶停),不评单组件深度(交 skill-dev),不查插件接线(交 plugin-dev)。仅手动 /optimize-any 触发。
data-ai
两层规则记忆 (基于 .skein/spec)。planning 时 recall 召回相关规则、task finish 后 sediment 沉淀学习 + prune 自动精简过期/重复/断链规则。core 常驻硬规 + recall 按需召回, 经判定门自动写盘 (不逐次问用户)。产出 .skein/spec 下 core/recall 规则文件 + index。另支持空仓 bootstrap 播种规则基线、记忆大面积失效 (大重构/换栈) 时 reconstruct 可逆归档后按项目类型分型重建、maintain 手动体检 (超预算/stale/断链/重复/废弃, --apply 自动修复)、auto-fix (Stop hook 写 .pending-fix 标记 → main 派 skein-specer bg 跑 maintain --apply 全自动修, 断链只报告)。