Genera un plugin de contacto con subida segura de archivos
Todo plugin de formulario técnicamente "soporta" subida de archivos, pero las partes seguras y aburridas — sniffing de mime, caps de tamaño, hook para antivirus, guardar fuera del webroot — es donde la mayoría filtra vulnerabilidades o atasca la carpeta uploads.
Un plugin a medida maneja los archivos como realmente quieres: adjunto en email de aviso, guardado en carpeta privada (o en S3/Spaces), borrado tras N días y rechazo de basura antes de tocar disco.
¿Por qué generarlo en vez de instalar un plugin existente?
Contact Form 7 + addon de uploads guarda en /wp-content/uploads que es público por defecto. Gravity Forms lo hace mejor pero Advanced File Upload es de plan de pago. WPForms mete uploads en Pro.
El plugin generado guarda en wp-content/uploads-private/ con .htaccess denegando acceso directo, valida por extensión Y finfo mime, caps por campo y total, y opcionalmente empuja a DO Spaces con URL firmada en email.
Esto son ~120 líneas PHP. Lo que evitas: una URL /uploads pública filtrando NDAs firmados, o un zip de 200MB llenando disco porque el visitante fue creativo.
Prompt de ejemplo
Este es el tipo de descripción que genera este plugin. Puedes partir de aquí y ajustar lo que necesites antes de generar.
Nombre del plugin: Acme Secure Contact
Campos: name, email, subject, message, attachments (hasta 3, c/u <=10MB, total <=20MB).
Tipos permitidos: pdf, jpg, jpeg, png, webp, zip (validado por finfo mime, no solo extensión).
Almacenamiento:
- Mover a wp-content/uploads-private/acme-contact/YYYY/MM/<uuid>.<ext>.
- Dejar .htaccess "Deny from all" y web.config equivalente.
- Opcional push a DO Spaces si DO_SPACES_KEY está set.
Submit:
- Fila en wp_acme_messages: name, email, subject, message, file paths, timestamp, IP.
- Email admin con URLs firmadas de descarga (24h) o adjunto inline si <5MB.
Retención: cron diario borra mensajes + archivos >30 días (configurable).
Admin inbox con filtros, marcar leído, borrado masivo.
reCAPTCHA v3 en submit.Qué suele incluir el plugin generado
- Formulario vía shortcode; postea a endpoint REST
- Doble validación mime (whitelist extensión + finfo_file)
- Caps por archivo y total forzados server-side
- Carpeta privada con Deny de Apache/IIS
- Offload opcional a S3/Spaces con URLs firmadas
- Inbox admin con búsqueda, descargas firmadas, borrado masivo
- Cron diario de retención limpiando archivos huérfanos
Whitelist mime, caps, retención, backend (local vs Spaces) y plantilla de aviso: todo en el prompt.
Preguntas frecuentes
¿Qué evita subir un PHP renombrado a .jpg?
Guarda fuera del webroot por defecto y deniega ejecución vía .htaccess/web.config. Aunque el archivo entre, no se puede ejecutar.
¿Puedo integrar antivirus?
Sí. Describe un endpoint (ClamAV, VirusTotal) y el plugin llama tras upload, cuarentena si positivo.
¿Cómo cumplo borrado GDPR?
El inbox admin tiene borrado por fila que elimina fila DB y archivos atómicamente. El cron también limpia expirados.