К основному содержанию
скилл CX Codex

cloudflare-workers-security — скилл для Claude Code: защита API

Шаблоны аутентификации, CORS, rate limiting и валидации ввода для Cloudflare Workers. Нужен, когда ставишь JWT или API-ключи, лечишь CORS-ошибки или защищаешь воркер от инъекций.

Установить в Claude Code · Через Skills CLI (Vercel) Все способы и платформы ↓
npx skills add secondsky/claude-skills --skill cloudflare-workers-security -a claude-code
Открыть на GitHub

Что делает cloudflare-workers-security

Скилл даёт готовые функции проверки JWT и API-ключей через crypto.subtle, конфигурацию CORS со списком разрешённых доменов, схемы валидации Zod и набор заголовков безопасности (CSP, HSTS, X-Frame-Options). Внутри — middleware для rate limiting по IP, шаблоны безопасного воркера и таблица десяти частых уязвимостей с симптомами. Все секреты должны лежать в wrangler secret, а не в коде.

Примеры построены на crypto.subtle для подписи токенов, хешировании ключей через SHA-256 перед записью в KV и Zod-схемах с ограничениями длины и типа. Без FFmpeg, Python или внешних API — только стандартные Workers API и npm-пакеты (zod). Если секреты попали в репозиторий — их надо ротировать, просто удалить из истории мало.

Какие задачи решает

  • проверить JWT или API-ключ на каждом запросе
  • настроить CORS для конкретных доменов без *
  • заблокировать IP после N запросов в минуту
  • валидировать JSON-тело через Zod-схему перед записью в D1
  • добавить CSP, HSTS и X-Content-Type-Options одной функцией

Примеры запросов агенту

  • Добавь проверку JWT из заголовка Authorization перед обработкой POST /api/orders
  • Разреши CORS только для app.mysite.com и admin.mysite.com
  • Ограничь /api/upload до пяти запросов в минуту с одного IP

Как установить cloudflare-workers-security

1Через Skills CLI (Vercel)

npx skills add secondsky/claude-skills --skill cloudflare-workers-security -a claude-code

2Вручную: положить файлы

~/.claude/skills/cloudflare-workers-security/SKILL.md

Папка скилла целиком; для одного проекта — .claude/skills/cloudflare-workers-security/

По шагам, с командами для каждой платформы: Как установить скилл в Claude Code: пять способов

Вопросы о cloudflare-workers-security

Как установить cloudflare-workers-security в Claude Code?

Выполни npx skills add secondsky/claude-skills --skill cloudflare-workers-security -a claude-code, скилл появится в ~/.claude/skills/cloudflare-workers-security/SKILL.md.

Что делает cloudflare-workers-security?

Предоставляет функции аутентификации (JWT, API-ключи), CORS-middleware, rate limiting по IP, Zod-валидацию и набор заголовков безопасности для Cloudflare Workers.

Где хранить секреты для JWT?

В Wrangler secrets через команду wrangler secret put JWT_SECRET. Скилл не читает секреты из кода или переменных окружения — только из env воркера.

Исходный текст

SKILL.md · MIT
---
name: cloudflare-workers-security
description: Cloudflare Workers security with authentication, CORS, rate limiting, input validation. Use for securing APIs, JWT/API keys, or encountering auth failures, CORS errors, XSS/injection vulnerabilities.
license: MIT
---

# Cloudflare Workers Security

Comprehensive security patterns for protecting Workers and APIs.

## Quick Security Checklist

```typescript
// 1. Validate all input
const validated = schema.parse(await request.json());

// 2. Authenticate requests
const user = await verifyToken(request.headers.get('Authorization'));
if (!user) return new Response('Unauthorized', { status: 401 });

// 3. Rate limit
const limited = await rateLimiter.check(clientIP);
if (!limited.allowed) return new Response('Too Many Requests', { status: 429 });

// 4. Add security headers
response.headers.set('X-Content-Type-Options', 'nosniff');
response.headers.set('X-Frame-Options', 'DENY');

// 5. Use HTTPS-only cookies
headers.set('Set-Cookie', 'session=xxx; Secure; HttpOnly; SameSite=Strict');
```

## Critical Rules

1. **Never trust client input** - Validate and sanitize everything
2. **Use secure secrets** - Store in Wrangler secrets, never in code
3. **Implement rate limiting** - Protect against abuse
4. **Set security headers** - Prevent common attacks
5. **Use CORS properly** - Don't use `*` in production

## Top 10 Security Errors

| Vulnerability | Symptom | Prevention |
|---------------|---------|------------|
| Missing auth | Unauthorized access | Verify tokens on every request |
| SQL injection | Data breach | Use parameterized queries with D1 |
| XSS | Script injection | Sanitize output, set CSP |
| CORS misconfiguration | Blocked requests or open access | Configure specific origins |
| Secrets in code | Exposed credentials | Use `wrangler secret` |
| Missing rate limits | DoS vulnerability | Implement per-IP limits |
| Weak tokens | Session hijacking | Use crypto.subtle for signing |
| Missing HTTPS | Data interception | Enforce HTTPS redirects |
| Insecure headers | Clickjacking, MIME attacks | Set security headers |
| Excessive permissions | Blast radius | Principle of least privilege |

## Authentication Patterns

### JWT Verification

```typescript
async function verifyJWT(token: string, secret: string): Promise<{ valid: boolean; payload?: unknown }> {
  try {
    const [headerB64, payloadB64, signatureB64] = token.split('.');

    // Verify signature
    const key = await crypto.subtle.importKey(
      'raw',
      new TextEncoder().encode(secret),
      { name: 'HMAC', hash: 'SHA-256' },
      false,
      ['verify']
    );

    const signature = Uint8Array.from(atob(signatureB64.replace(/-/g, '+').replace(/_/g, '/')), c => c.charCodeAt(0));
    const data = new TextEncoder().encode(`${headerB64}.${payloadB64}`);

    const valid = await crypto.subtle.verify('HMAC', key, signature, data);
    if (!valid) return { valid: false };

    // Decode payload
    const payload = JSON.parse(atob(payloadB64.replace(/-/g, '+').replace(/_/g, '/')));

    // Check expiration
    if (payload.exp && Date.now() / 1000 > payload.exp) {
      return { valid: false };
    }

    return { valid: true, payload };
  } catch {
    return { valid: false };
  }
}
```

### API Key Validation

```typescript
async function validateApiKey(
  request: Request,
  env: Env
): Promise<{ valid: boolean; clientId?: string }> {
  const apiKey = request.headers.get('X-API-Key');
  if (!apiKey) return { valid: false };

  // Hash the key for lookup (never store plain keys)
  const keyHash = await sha256(apiKey);

  // Lookup in KV or D1
  const client = await env.KV.get(`apikey:${keyHash}`, 'json');
  if (!client) return { valid: false };

  return { valid: true, clientId: client.id };
}

async function sha256(str: string): Promise<string> {
  const buffer = await crypto.subtle.digest('SHA-256', new TextEncoder().encode(str));
  return [...new Uint8Array(buffer)].map(b => b.toString(16).padStart(2, '0')).join('');
}
```

## Input Validation

### With Zod

```typescript
import { z } from 'zod';

const UserSchema = z.object({
  name: z.string().min(1).max(100),
  email: z.email(),
  age: z.number().int().min(0).max(150).optional(),
});

async function handleCreate(request: Request): Promise<Response> {
  try {
    const body = await request.json();
    const user = UserSchema.parse(body);

    // Safe to use validated data
    return Response.json({ success: true, user });
  } catch (error) {
    if (error instanceof z.ZodError) {
      return Response.json({ error: 'Validation failed', details: error.errors }, { status: 400 });
    }
    throw error;
  }
}
```

## Security Headers

```typescript
function addSecurityHeaders(response: Response): Response {
  const headers = new Headers(response.headers);

  // Prevent MIME type sniffing
  headers.set('X-Content-Type-Options', 'nosniff');

  // Prevent clickjacking
  headers.set('X-Frame-Options', 'DENY');

  // XSS protection
  headers.set('X-XSS-Protection', '1; mode=block');

  // Content Security Policy
  headers.set('Content-Security-Policy', "default-src 'self'; script-src 'self'");

  // HSTS
  headers.set('Strict-Transport-Security', 'max-age=31536000; includeSubDomains');

  // Referrer policy
  headers.set('Referrer-Policy', 'strict-origin-when-cross-origin');

  return new Response(response.body, { status: response.status, headers });
}
```

## CORS Configuration

```typescript
const ALLOWED_ORIGINS = ['https://app.example.com', 'https://admin.example.com'];

function handleCORS(request: Request, response: Response): Response {
  const origin = request.headers.get('Origin');

  if (!origin || !ALLOWED_ORIGINS.includes(origin)) {
    return response; // No CORS headers
  }

  const headers = new Headers(response.headers);
  headers.set('Access-Control-Allow-Origin', origin);
  headers.set('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS');
  headers.set('Access-Control-Allow-Headers', 'Content-Type, Authorization');
  headers.set('Access-Control-Allow-Credentials', 'true');
  headers.set('Access-Control-Max-Age', '86400');

  return new Response(response.body, { status: response.status, headers });
}
```

## When to Load References

Load specific references based on the task:

- **Implementing authentication?** → Load `references/authentication.md`
- **CORS issues?** → Load `references/cors-security.md`
- **Validating input?** → Load `references/input-validation.md`
- **Managing secrets?** → Load `references/secrets-management.md`
- **Rate limiting?** → Load `references/rate-limiting.md`
- **Security headers?** → Load `references/security-headers.md`

## Templates

| Template | Purpose | Use When |
|----------|---------|----------|
| `templates/auth-middleware.ts` | JWT/API key auth | Adding authentication |
| `templates/cors-handler.ts` | CORS middleware | Handling cross-origin |
| `templates/rate-limiter.ts` | Rate limiting | Preventing abuse |
| `templates/secure-worker.ts` | Full secure setup | Starting secure project |

## Scripts

| Script | Purpose | Command |
|--------|---------|---------|
| `scripts/security-audit.sh` | Audit security | `./security-audit.sh <url>` |

## Resources

- Security: https://developers.cloudflare.com/workers/platform/security/
- WAF: https://developers.cloudflare.com/waf/
- Rate Limiting: https://developers.cloudflare.com/workers/runtime-apis/bindings/rate-limit/

© secondsky · MIT · secondsky/claude-skills

Похожие скиллы

Все скиллы по теме «Безопасность» →
git-guardrails-claude-code Matt Pocock Скилл ставит хук Claude Code, который останавливает опасные Git-команды до их запуска. Нужен, если агент не должен делать push или удалять изменения. 499 069установок ponytail-review DietrichGebert Скилл проверяет изменения глубже обычного diff: читает связанный код, ищет ошибки, риски, проблемы нагрузки и недостающие тесты. Пригодится для ревью PR и коммитов. CX Codex +1 57 000установок ponytail-audit DietrichGebert Проверяет репозиторий и ранжирует ошибки, риски и лишний код. Подойдёт, если нужен разовый разбор без автоматических правок. CX Codex +1 45 400установок security-audit cloudflare Проверяет кодовую базу на уязвимости и ищет нарушения границ доверия. Пригодится перед релизом или для точечного разбора опасных участков кода. CX Codex +1 54 800установок security-and-hardening addyosmani Помогает проектировать защиту и проверять код на уязвимости при работе с вводом, авторизацией, сессиями и внешними сервисами. Подойдёт перед релизом и при создании функций, которые обрабатывают недоверенные данные. CX Codex +1 70 200установок supabase официальный supabase Скилл помогает настраивать базу данных, аутентификацию и RLS в Supabase без скрытых дыр в безопасности. CX Codex GP ChatGPT 8установок

Из того же набора116

maz-ui Скилл даёт агенту знание Maz-UI v4: 50+ компонентов, composables, директивы и темы для Vue 3 и Nuxt 3. Пригодится, когда собираете формы, диалоги или таблицы. CX Codex +1 369установок woocommerce-code-review Скилл проверяет код WooCommerce на соответствие стандартам архитектуры PHP и текстам интерфейса. Пригодится при локальном ревью и подготовке пулл-реквестов. CX Codex +1 366установок woocommerce-dev-cycle Скилл ведёт по циклу разработки WooCommerce: запускает тесты, чинит стиль кода и разбирает ошибки линтинга. CX Codex +1 361установок woocommerce-copy-guidelines Скилл задаёт правила написания пользовательских текстов в WooCommerce: подписи кнопок, метки полей, сообщения и документация. Пригодится, когда интерфейс магазина пишут несколько человек. CX Codex +1 363установок cloudflare-workers-testing Скилл для написания тестов Cloudflare Workers на Vitest с реальными биндингами D1, KV, R2 и Durable Objects. Пригодится, когда тесты падают на моках или не видят окружение. CX Codex +1 325установок nuxt-seo Скилл по восьми модулям Nuxt SEO v5: robots.txt, карты сайта, OG-картинки, Schema.org и метатеги. Пригодится, когда SEO надо настроить в Nuxt-проекте. CX Codex +1 324установок cloudflare-workers-performance Скилл для оптимизации Cloudflare Workers: CPU, память, кеш, размер бандла. Пригодится, когда воркер тормозит или упирается в лимиты. CX Codex +1 315установок cloudflare-workers-runtime-apis Скилл по рантайм-API Cloudflare Workers: Fetch, Streams, Crypto, Cache, WebSockets и кодирование текста. Пригодится, когда воркер ловит ошибки на запросах, потоках или кэше. CX Codex +1 311установок

Спонсоры проекта

Компании, которые помогают держать аналитику открытой