Pular para o conteúdo
Skillpedia
APIs e servidores (backend)48 mil · #2999

file-uploads

Gerencia envios de arquivos e armazenamento na nuvem, como S3 e Cloudflare R2. Otimiza imagens e lida com arquivos grandes sem travar. Útil para aplicações que precisam guardar arquivos.

O que ela faz

Este especialista ajuda a enviar arquivos para a nuvem de forma segura e eficiente. Ele sabe como lidar com arquivos grandes e otimizar imagens.

Quando usar

  • ✓Quando você precisa enviar um arquivo grande para um serviço na nuvem.
  • ✓Ao configurar um sistema para receber uploads de imagens ou outros arquivos.
  • ✓Se você quer garantir que os arquivos enviados sejam do tipo correto e seguros.

Exemplo do que pedir para a IA

“Configure um upload seguro de imagens para o meu site usando S3.”

Quer saber mais? Abra as seções abaixo.

Como usar

O jeito mais fácil: copie a mensagem abaixo e cole no Claude, ChatGPT, Cursor ou outra IA. Ela lê a skill e segue as instruções.

Link da skill

https://github.com/sickn33/agentic-awesome-skills/blob/main/plugins/agentic-awesome-skills-claude/skills/file-uploads/SKILL.md

Mensagem pronta para colar

Use esta skill para me ajudar: https://github.com/sickn33/agentic-awesome-skills/blob/main/plugins/agentic-awesome-skills-claude/skills/file-uploads/SKILL.md Leia o arquivo SKILL.md desse link e siga as instruções dele na minha tarefa.
Como funciona

Ele usa técnicas para verificar o tipo real do arquivo (não apenas o nome) e define limites de tamanho para evitar sobrecarga. Também garante que os nomes dos arquivos sejam seguros para evitar problemas.

Instalação

Jeito mais fácil: copie o link da skill e cole no Claude, ChatGPT ou Cursor pedindo para seguir as instruções.

No terminal (Claude Code, Codex, Cursor), na pasta do projeto:

npx skills add sickn33/agentic-awesome-skills --skill file-uploads

Ou baixe só o arquivo:

curl -L https://raw.githubusercontent.com/sickn33/agentic-awesome-skills/main/plugins/agentic-awesome-skills-claude/skills/file-uploads/SKILL.md -o SKILL.md
Conteúdo técnico (SKILL.md)

Tradução do texto original do autor no GitHub. Os comandos e códigos estão como no original.

Uploads e Armazenamento de Arquivos

Especialista em lidar com uploads de arquivos e armazenamento em nuvem. Abrange S3, Cloudflare R2, URLs pré-assinadas, uploads multipart e otimização de imagens. Sabe como lidar com arquivos grandes sem bloquear.

Função: Especialista em Upload de Arquivos

Cuidadoso com segurança e desempenho. Nunca confia em extensões de arquivo. Sabe que uploads grandes precisam de tratamento especial. Prefere URLs pré-assinadas em vez de proxy de servidor.

Princípios

  • Nunca confie nas alegações de tipo de arquivo do cliente
  • Use URLs pré-assinadas para uploads diretos
  • Transmita arquivos grandes, nunca armazene em buffer
  • Valide no upload, otimize depois

Pontos Críticos

Confiar no tipo de arquivo fornecido pelo cliente

Gravidade: CRÍTICA

Situação: O usuário carrega malware.exe renomeado para image.jpg. Você verifica a extensão, parece bom. Armazena. Serve. Outro usuário baixa e executa.

Sintomas:

  • Malware carregado como imagens
  • Content-type incorreto servido

Por que isso falha: Extensões de arquivo e cabeçalhos Content-Type podem ser falsificados. Atacantes renomeiam executáveis para contornar filtros.

Correção recomendada:

VERIFIQUE BYTES MÁGICOS

import { fileTypeFromBuffer } from "file-type";

async function validateImage(buffer: Buffer) { const type = await fileTypeFromBuffer(buffer);

const allowedTypes = ["image/jpeg", "image/png", "image/webp"];

if (!type || !allowedTypes.includes(type.mime)) { throw new Error("Tipo de arquivo inválido"); }

return type; }

// Para streams import { fileTypeFromStream } from "file-type"; const type = await fileTypeFromStream(readableStream);

Sem restrições de tamanho de upload

Gravidade: ALTA

Situação: Sem limite de tamanho de arquivo. Atacante carrega arquivo de 10 GB. Servidor fica sem memória ou disco. Negação de serviço. Ou conta de armazenamento massiva.

Sintomas:

  • Servidor trava em uploads grandes
  • Contas de armazenamento massivas
  • Exaustão de memória

Por que isso falha: Sem limites, atacantes podem esgotar recursos. Mesmo usuários legítimos podem acidentalmente carregar arquivos enormes.

Correção recomendada:

DEFINA LIMITES DE TAMANHO

// Formidable const form = formidable({ maxFileSize: 10 * 1024 * 1024, // 10MB });

// Multer const upload = multer({ limits: { fileSize: 10 * 1024 * 1024 }, });

// Verificação inicial no lado do cliente if (file.size > 10 * 1024 * 1024) { alert("Arquivo muito grande (máximo 10MB)"); return; }

// URL pré-assinada com limite de tamanho const command = new PutObjectCommand({ Bucket: BUCKET, Key: key, ContentLength: expectedSize, // Forçar tamanho });

Nome de arquivo controlado pelo usuário permite travessia de diretório

Gravidade: CRÍTICA

Situação: Usuário carrega arquivo chamado "../../../etc/passwd". Você usa o nome do arquivo diretamente. Arquivo salvo fora do diretório de upload. Arquivos do sistema sobrescritos.

Sintomas:

  • Arquivos fora do diretório de upload
  • Acesso a arquivos do sistema

Por que isso falha: A entrada do usuário nunca deve ser usada diretamente em caminhos de arquivo. Sequências de travessia de diretório podem escapar dos diretórios pretendidos.

Correção recomendada:

SANITIZE NOMES DE ARQUIVO

import path from "path"; import crypto from "crypto";

function safeFilename(userFilename: string): string { // Extrai apenas o nome base const base = path.basename(userFilename);

// Remove quaisquer caracteres de caminho restantes const sanitized = base.replace(/[^a-zA-Z0-9.-]/g, "_");

// Ou melhor: gere um novo nome completamente const ext = path.extname(userFilename).toLowerCase(); const allowed = [".jpg", ".png", ".pdf"];

if (!allowed.includes(ext)) { throw new Error("Extensão inválida"); }

return crypto.randomUUID() + ext; }

// Nunca faça isso const path = "uploads/" + req.body.filename; // PERIGO!

// Faça isso const path = "uploads/" + safeFilename(req.body.filename);

URL pré-assinada compartilhada ou em cache incorretamente

Gravidade: MÉDIA

Situação: URL pré-assinada para arquivo privado retornada na resposta da API. Resposta em cache pela CDN. Qualquer pessoa com a URL em cache pode acessar o arquivo privado por horas.

Sintomas:

  • Arquivos privados acessíveis via URLs em cache
  • Acesso após expiração

Por que isso falha: URLs pré-assinadas concedem acesso temporário. Se em cache ou compartilhadas, o acesso se estende além do escopo pretendido.

Correção recomendada:

CONTROLE A DISTRIBUIÇÃO DE URL PRÉ-ASSINADA

// Expiração curta para arquivos sensíveis const url = await getSignedUrl(s3, command, { expiresIn: 300, // 5 minutos });

// Cabeçalhos no-cache para respostas de URL pré-assinadas return Response.json({ url }, { headers: { "Cache-Control": "no-store, max-age=0", }, });

// Ou use URLs assinadas do CloudFront para mais controle

Verificações de Validação

Apenas verificando a extensão do arquivo

Gravidade: CRÍTICA

Mensagem: Verifique bytes mágicos, não apenas a extensão

Ação de correção: Use a biblioteca file-type para verificar o tipo real

…

Perguntas frequentes

Por que não confiar apenas no nome do arquivo?

Nomes de arquivo podem ser facilmente alterados para enganar o sistema, como renomear um vírus para parecer uma imagem. É preciso verificar o conteúdo real do arquivo.

O que acontece se eu tentar enviar um arquivo muito grande?

Sem limites, arquivos muito grandes podem travar o servidor ou gerar custos altos de armazenamento. Este especialista define limites para evitar isso.

O que são 'presigned URLs'?

São links temporários e seguros que permitem que você (ou outra pessoa) envie ou baixe um arquivo diretamente da nuvem, sem que o servidor precise intermediar tudo. Isso é mais rápido e eficiente.

Detalhes

Descrição original do autor

Expert at handling file uploads and cloud storage. Covers S3, Cloudflare R2, presigned URLs, multipart uploads, and image optimization. Knows how to handle large files without blocking.

repo: sickn33/agentic-awesome-skills

Popularidade

Estrelas no GitHub
48 mil
Posição no ranking
#2999
Licença
MIT
Atualizada em
15/10/2026

Essa skill é útil?

0

Entre para votar.

Comentários

  • …

Mais skills deste repositório

Skills parecidas