Skip to main content التثبيت باستخدام Codex أو Claude انسخ هذا Prompt والصقه في Codex أو Claude أو مساعد آخر ليراجع صفحة Skill ويثبّتها لك.
يتجاوز الأمر المباشر Prompt المخصّص للمراجعة. افحص المصدر قبل تشغيله.
npx skills add https://github.com/xu-xiang/everything-claude-code-zh --skill security-reviewيبقى الأمر في سطر واحد. مرّر أفقيًا لمراجعته كاملًا قبل النسخ.
تفضّل نسخة محلية؟ نزّل الملفات المتاحة حاليًا لدى SkillsMP.
المهن ذات الصلةSOC
استنادا إلى تصنيف SOC المهني
| name | security-review |
| description | 当涉及添加身份验证(Authentication)、处理用户输入、操作机密(Secrets)、创建 API 终端节点或实现支付/敏感功能时,请使用此技能。提供全面的安全检查清单和模式。 |
| origin | ECC |
安全审查技能(Security Review Skill)
本技能(Skill)旨在确保所有代码遵循安全最佳实践,并识别潜在的漏洞。
何时激活
- 实现身份验证(Authentication)或授权(Authorization)时
- 处理用户输入或文件上传时
- 创建新的 API 终端节点时
- 操作机密(Secrets)或凭据(Credentials)时
- 实现支付功能时
- 存储或传输敏感数据时
- 集成第三方 API 时
安全检查清单
1. 机密管理(Secrets Management)
❌ 严禁这样做
const apiKey = "sk-proj-xxxxx"
const dbPassword = "password123"
✅ 务必这样做
const apiKey = process.env.OPENAI_API_KEY
const dbUrl = process.env.DATABASE_URL
if (!apiKey) {
throw new Error('OPENAI_API_KEY not configured')
}
验证步骤
- 无硬编码的 API 密钥(Keys)、令牌(Tokens)或密码
所有机密均存储在环境变量中 .env.local 已包含在 .gitignore 中 Git 历史记录中无机密信息 生产环境机密配置在托管平台(如 Vercel, Railway)2. 输入校验(Input Validation)
始终校验用户输入
import { z } from 'zod'
const CreateUserSchema = z.object({
email: z.string().email(),
name: z.string().min(1).max(100),
age: z.number().int().min(0).max(150)
})
export async function createUser(input: unknown) {
try {
const validated = CreateUserSchema.parse(input)
return await db.users.create(validated)
} catch (error) {
if (error instanceof z.ZodError) {
return { success: false, errors: error.errors }
}
throw error
}
}
文件上传校验
function validateFileUpload(file: File) {
const maxSize = 5 * 1024 * 1024
if (file.size > maxSize) {
throw new Error('File too large (max 5MB)')
}
const allowedTypes = ['image/jpeg', 'image/png', 'image/gif']
if (!allowedTypes.includes(file.type)) {
throw new Error('Invalid file type')
}
const allowedExtensions = ['.jpg', '.jpeg', '.png', '.gif']
const extension = file.name.toLowerCase().match(/\.[^.]+$/)?.[0]
if (!extension || !allowedExtensions.includes(extension)) {
throw new Error('Invalid file extension')
}
return true
}
验证步骤
3. SQL 注入防御(SQL Injection Prevention)
❌ 严禁拼接 SQL
const query = `SELECT * FROM users WHERE email = '${userEmail}'`
await db.query(query)
✅ 务必使用参数化查询
const { data } = await supabase
.from('users')
.select('*')
.eq('email', userEmail)
await db.query(
'SELECT * FROM users WHERE email = $1',
[userEmail]
)
验证步骤
4. 身份验证与授权(Authentication & Authorization)
JWT 令牌处理
localStorage.setItem('token', token)
res.setHeader('Set-Cookie',
`token=${token}; HttpOnly; Secure; SameSite=Strict; Max-Age=3600`)
授权检查
export async function deleteUser(userId: string, requesterId: string) {
const requester = await db.users.findUnique({
where: { id: requesterId }
})
if (requester.role !== 'admin') {
return NextResponse.json(
{ error: 'Unauthorized' },
{ status: 403 }
)
}
await db.users.delete({ where: { id: userId } })
}
行级安全性(Row Level Security, Supabase)
ALTER TABLE users ENABLE ROW LEVEL SECURITY;
CREATE POLICY "Users view own data"
ON users FOR SELECT
USING (auth.uid() = id);
CREATE POLICY "Users update own data"
ON users FOR UPDATE
USING (auth.uid() = id);
验证步骤
5. XSS 防御(XSS Prevention)
清理 HTML
import DOMPurify from 'isomorphic-dompurify'
function renderUserContent(html: string) {
const clean = DOMPurify.sanitize(html, {
ALLOWED_TAGS: ['b', 'i', 'em', 'strong', 'p'],
ALLOWED_ATTR: []
})
return <div dangerouslySetInnerHTML={{ __html: clean }} />
}
内容安全策略(Content Security Policy)
const securityHeaders = [
{
key: 'Content-Security-Policy',
value: `
default-src 'self';
script-src 'self' 'unsafe-eval' 'unsafe-inline';
style-src 'self' 'unsafe-inline';
img-src 'self' data: https:;
font-src 'self';
connect-src 'self' https://api.example.com;
`.replace(/\s{2,}/g, ' ').trim()
}
]
验证步骤
6. CSRF 保护(CSRF Protection)
CSRF 令牌
import { csrf } from '@/lib/csrf'
export async function POST(request: Request) {
const token = request.headers.get('X-CSRF-Token')
if (!csrf.verify(token)) {
return NextResponse.json(
{ error: 'Invalid CSRF token' },
{ status: 403 }
)
}
}
SameSite Cookies
res.setHeader('Set-Cookie',
`session=${sessionId}; HttpOnly; Secure; SameSite=Strict`)
验证步骤
7. 速率限制(Rate Limiting)
API 速率限制
import rateLimit from 'express-rate-limit'
const limiter = rateLimit({
windowMs: 15 * 60 * 1000,
max: 100,
message: 'Too many requests'
})
app.use('/api/', limiter)
高消耗操作
const searchLimiter = rateLimit({
windowMs: 60 * 1000,
max: 10,
message: 'Too many search requests'
})
app.use('/api/search', searchLimiter)
验证步骤
8. 敏感数据泄露(Sensitive Data Exposure)
日志记录
console.log('User login:', { email, password })
console.log('Payment:', { cardNumber, cvv })
console.log('User login:', { email, userId })
console.log('Payment:', { last4: card.last4, userId })
错误消息
catch (error) {
return NextResponse.json(
{ error: error.message, stack: error.stack },
{ status: 500 }
)
}
catch (error) {
console.error('Internal error:', error)
return NextResponse.json(
{ error: 'An error occurred. Please try again.' },
{ status: 500 }
)
}
验证步骤
9. 区块链安全 (Solana)
钱包验证
import { verify } from '@solana/web3.js'
async function verifyWalletOwnership(
publicKey: string,
signature: string,
message: string
) {
try {
const isValid = verify(
Buffer.from(message),
Buffer.from(signature, 'base64'),
Buffer.from(publicKey, 'base64')
)
return isValid
} catch (error) {
return false
}
}
交易验证
async function verifyTransaction(transaction: Transaction) {
if (transaction.to !== expectedRecipient) {
throw new Error('Invalid recipient')
}
if (transaction.amount > maxAmount) {
throw new Error('Amount exceeds limit')
}
const balance = await getBalance(transaction.from)
if (balance < transaction.amount) {
throw new Error('Insufficient balance')
}
return true
}
验证步骤
10. 依赖安全(Dependency Security)
定期更新
npm audit
npm audit fix
npm update
npm outdated
锁定文件
git add package-lock.json
npm ci
验证步骤
安全测试
自动化安全测试
test('requires authentication', async () => {
const response = await fetch('/api/protected')
expect(response.status).toBe(401)
})
test('requires admin role', async () => {
const response = await fetch('/api/admin', {
headers: { Authorization: `Bearer ${userToken}` }
})
expect(response.status).toBe(403)
})
test('rejects invalid input', async () => {
const response = await fetch('/api/users', {
method: 'POST',
body: JSON.stringify({ email: 'not-an-email' })
})
expect(response.status).toBe(400)
})
test('enforces rate limits', async () => {
const requests = Array(101).fill(null).map(() =>
fetch('/api/endpoint')
)
const responses = await Promise.all(requests)
const tooManyRequests = responses.filter(r => r.status === 429)
expect(tooManyRequests.length).toBeGreaterThan(0)
})
部署前安全检查清单
资源
请记住:安全并非可选项。哪怕是一个漏洞也可能危及整个平台。如有疑虑,请采取更审慎的做法。