🛡️ 1. NONCES (Prevención de CSRF)
📌 ¿Qué es un nonce?
Un nonce (number used once) es un token de seguridad que ayuda a verificar que una solicitud es legítima y fue enviada por un usuario autorizado.
⚠️ No cifra, no autentica, pero protege contra ataques de tipo CSRF (Cross-Site Request Forgery).
// En el handler
if (
!isset($_POST['libro_nonce']) ||
!wp_verify_nonce($_POST['libro_nonce'], 'guardar_libro_seguro')
) {
wp_die('No autorizado.');
}
🔄 Equivalente en enlaces:
$enlace_seguro = wp_nonce_url(admin_url('admin.php?page=eliminar_dato&id=34'), 'eliminar_dato', 'nonce');
Y luego:
check_admin_referer('eliminar_dato', 'nonce');
🧼 2. SANITIZACIÓN: LIMPIAR ANTES DE GUARDAR
Regla de oro: Sanitiza antes de guardar, escapa antes de mostrar.
⚠️ Nunca guardes datos directamente sin sanitizarlos, incluso si vienen de
$_POST,$_GETo$_REQUEST.-
🧪 Funciones comunes
| Función | Uso típico |
|---|---|
sanitize_text_field() | Cadenas simples (input type="text") |
sanitize_email() | Correos electrónicos |
sanitize_textarea_field() | Textareas |
intval() / floatval() | Números |
esc_url_raw() | URLs antes de guardar |
wp_kses_post() | HTML limitado en contenido |
$nombre = sanitize_text_field($_POST['nombre']);
$email = sanitize_email($_POST['email']);
$mensaje = wp_kses_post($_POST['mensaje']);
$visitas = intval($_POST['visitas']);
🎯 3. ESCAPING: LIMPIAR ANTES DE MOSTRAR
¿Vas a imprimir algo en el navegador? Escápalo.
⚠️ Usar
echo $variabledirecto es riesgoso si el contenido no ha sido escapado previamente.
🧩 Funciones más usadas
| Función | Cuándo usarlo |
|---|---|
esc_html() | Texto plano (<p>, <div>, etc.) |
esc_attr() | Dentro de atributos (value, href, etc.) |
esc_url() | Para imprimir enlaces (href, src) |
esc_textarea() | Para mostrar texto en un <textarea> |
📌 Ejemplo real
🧨 4. SQL INJECTION Y $wpdb->prepare()
❌ Nunca hagas esto:
// ¡PELIGRO!
$usuarios = $wpdb->get_results("SELECT * FROM wp_users WHERE user_login = '$login'");
✅ Siempre así:
$usuarios = $wpdb->get_results(
$wpdb->prepare("SELECT * FROM wp_users WHERE user_login = %s", $login)
);
🧰 5. Otras buenas prácticas de seguridad
| Práctica | Ejemplo o herramienta |
|---|---|
| Validar roles y capacidades | current_user_can('edit_posts') |
| Proteger archivos de acceso directo | if (!defined('ABSPATH')) exit; |
| Controlar acceso con condiciones | is_admin(), wp_doing_ajax() |
| Escapar JSON si usas JS inline | wp_json_encode($array) |
| Desactivar XML-RPC si no se usa | add_filter('xmlrpc_enabled', '__return_false'); |
Bloquear ejecución de archivos PHP en uploads/ | .htaccess |
🧠 Resumen Profesional
| Acción | Función clave | Cuándo usarla |
|---|---|---|
| Verificar formularios | wp_nonce_field, check_admin_referer | Antes de guardar datos del usuario |
| Sanitizar entrada | sanitize_* | Al recibir datos de formularios |
| Escapar salida | esc_* | Al imprimir en el HTML |
| Prevenir SQLi | $wpdb->prepare() | Al usar consultas SQL |
| Control de roles | current_user_can() | En funciones protegidas |