关于 application-security
为 Web 应用开发者提供安全编码指导,涵盖常见漏洞、验证模式和安全测试工具。内容结合代码示例与实用的加固检查清单。
主要功能
- 01OWASP Top 10 代码示例
- 02身份验证与访问控制指导
- 03输入验证和速率限制
- 04CSP 与安全标头
- 05SAST、DAST 和依赖项扫描
适用场景
- 01检查 Web 代码中的注入风险
- 02加固身份验证端点
- 03规划依赖项安全检查
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ travisjneuman/ .claude --skill application-security安装后在 Claude Code 中输入/application-security确认已加载。
详细介绍
应用安全技能
面向 Web 应用的安全编码模式、漏洞防范和安全工具。
OWASP Top 10(2021)及代码示例
A01:访问控制失效
// BAD - No authorization check
app.get('/api/users/:id', async (req, res) => {
const user = await db.user.findUnique({ where: { id: req.params.id } });
res.json(user);
});
// GOOD - Verify ownership or role
app.get('/api/users/:id', authenticate, async (req, res) => {
if (req.user.id !== req.params.id && req.user.role !== 'ADMIN') {
return res.status(403).json({ error: 'Forbidden' });
}
const user = await db.user.findUnique({ where: { id: req.params.id } });
res.json(user);
});
A02:加密机制失效
// BAD - Weak hashing
import crypto from 'crypto';
const hash = crypto.createHash('md5').update(password).digest('hex');
// GOOD - Use bcrypt with proper rounds
import bcrypt from 'bcrypt';
const hash = await bcrypt.hash(password, 12);
const isValid = await bcrypt.compare(password, hash);
A03:注入
// BAD - SQL injection
const query = `SELECT * FROM users WHERE email = '${email}'`;
// GOOD - Parameterized queries (Prisma handles this automatically)
const user = await prisma.user.findUnique({ where: { email } });
// GOOD - Parameterized raw SQL when needed
const users = await prisma.$queryRaw`SELECT * FROM users WHERE email = ${email}`;
A07:跨站脚本攻击(XSS)
// BAD - Rendering raw HTML
element.innerHTML = userInput;
// GOOD - Use textContent or framework escaping
element.textContent = userInput;
// GOOD - React auto-escapes by default
return <div>{userInput}</div>;
// BAD in React - dangerouslySetInnerHTML
return <div dangerouslySetInnerHTML={{ __html: userInput }} />;
内容安全策略(CSP)
推荐的标头
// Next.js middleware
import { NextResponse } from 'next/server';
export function middleware(request: Request) {
const nonce = crypto.randomUUID();
const csp = [
`default-src 'self'`,
`script-src 'self' 'nonce-${nonce}'`,
`style-src 'self' 'unsafe-inline'`,
`img-src 'self' data: https:`,
`font-src 'self'`,
`connect-src 'self' https://api.example.com`,
`frame-ancestors 'none'`,
`base-uri 'self'`,
`form-action 'self'`,
].join('; ');
const response = NextResponse.next();
response.headers.set('Content-Security-Policy', csp);
response.headers.set('X-Content-Type-Options', 'nosniff');
response.headers.set('X-Frame-Options', 'DENY');
response.headers.set('Referrer-Policy', 'strict-origin-when-cross-origin');
response.headers.set('Permissions-Policy', 'camera=(), microphone=(), geolocation=()');
return response;
}
SAST/DAST 工具
静态分析(SAST)
| 工具 | 语言 | 用法 |
|---|---|---|
| ESLint 安全插件 | JS/TS | eslint-plugin-security、@microsoft/eslint-plugin-sdl |
| Semgrep | 多种 | semgrep --config=auto . |
| Bandit | Python | bandit -r src/ |
| gosec | Go | gosec ./... |
| cargo-audit | Rust | cargo audit |
动态分析(DAST)
| 工具 | 用途 | 用法 |
|---|---|---|
| OWASP ZAP | Web 应用扫描 | 基于代理的扫描器、API 扫描模式 |
| Nuclei | 漏洞扫描 | 基于模板的扫描器 |
| Burp Suite | 手动 + 自动化 | 专业渗透测试 |
依赖项扫描
# Node.js
npm audit
npm audit fix
# Python
pip-audit
safety check
# Go
govulncheck ./...
# Rust
cargo audit
输入验证模式
服务端验证(始终必需)
import { z } from 'zod';
const CreateUserSchema = z.object({
email: z.string().email().max(255),
name: z.string().min(1).max(100).regex(/^[a-zA-Z\s'-]+$/),
age: z.number().int().min(0).max(150).optional(),
});
function createUser(input: unknown) {
const validated = CreateUserSchema.parse(input);
// validated is now typed and safe
}
速率限制
import rateLimit from 'express-rate-limit';
const authLimiter = rateLimit({
windowMs: 15 * 60 * 1000, // 15 minutes
max: 5, // 5 attempts per window
message: 'Too many login attempts, please try again later',
standardHeaders: true,
legacyHeaders: false,
});
app.use('/api/auth/login', authLimiter);
安全检查清单
- 所有用户输入都在服务端进行验证
- 所有数据库操作都使用参数化查询
- 已配置 CSP 标头
- 对身份验证端点实施速率限制
- 正确限制 CORS
- 密钥存储在环境变量中,而非代码中
- 已扫描依赖项中的漏洞
- 身份验证令牌存储在 httpOnly Cookie 中
- 在生产环境中强制使用 HTTPS
- 错误消息不会泄露内部细节
相关资源
~/.claude/docs/reference/checklists/security-hardening.md- 安全加固检查清单~/.claude/agents/security-auditor.md- 安全审计 Agent~/.claude/skills/authentication-patterns/SKILL.md- 身份验证模式
默认安全。于边界处进行验证。纵深防御。
评论
支持 Markdown