Wordpress Documentation

advertise, Anuncio

🔐 SEGURIDAD EN WORDPRESS: GUÍA AVANZADA

🛡️ 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 formulario -->
<?php wp_nonce_field('guardar_libro_seguro', 'libro_nonce'); ?>

				
			
				
					// 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, $_GET o $_REQUEST.-

🧪 Funciones comunes

FunciónUso 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 $variable directo es riesgoso si el contenido no ha sido escapado previamente.

🧩 Funciones más usadas

FunciónCuá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

 
				
					<input type="text" value="<?php echo esc_attr($nombre); ?>">
<a href="<?php echo esc_url($url); ?>"><?php echo esc_html($titulo); ?></a>

				
			

🧨 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ácticaEjemplo o herramienta
Validar roles y capacidadescurrent_user_can('edit_posts')
Proteger archivos de acceso directoif (!defined('ABSPATH')) exit;
Controlar acceso con condicionesis_admin(), wp_doing_ajax()
Escapar JSON si usas JS inlinewp_json_encode($array)
Desactivar XML-RPC si no se usaadd_filter('xmlrpc_enabled', '__return_false');
Bloquear ejecución de archivos PHP en uploads/.htaccess

🧠 Resumen Profesional

AcciónFunción claveCuándo usarla
Verificar formularioswp_nonce_field, check_admin_refererAntes de guardar datos del usuario
Sanitizar entradasanitize_*Al recibir datos de formularios
Escapar salidaesc_*Al imprimir en el HTML
Prevenir SQLi$wpdb->prepare()Al usar consultas SQL
Control de rolescurrent_user_can()En funciones protegidas