¿Qué son las Vulnerabilidades XSS y SQL Injection?

Cross-Site Scripting (XSS): Permite la ejecución de scripts maliciosos en el navegador de un usuario, lo que puede conducir al robo de información o la manipulación del contenido de una página.

SQL Injection: Consiste en la manipulación de consultas SQL a través de entradas no seguras, lo que puede permitir acceso no autorizado a bases de datos o la alteración de información.

Buenas Prácticas para Prevenir XSS

  • Escapar y sanitizar la entrada del usuario: Filtrar y codificar caracteres especiales para evitar la ejecución de scripts maliciosos.
  • Uso de Content Security Policy (CSP): Configurar reglas para restringir la ejecución de scripts no autorizados.
  • Evitar la inyección de datos dinámicos en HTML sin validación: No utilizar `innerHTML` directamente con datos de usuario en JavaScript.

Ejemplo de Prevención de XSS en JavaScript

Este código muestra cómo sanitizar la entrada del usuario para evitar ataques XSS:

function sanitizeInput(input) {
    const temp = document.createElement("div");
    temp.textContent = input;
    return temp.innerHTML;
}

const userInput = "<script>alert('Hacked!')</script>";
const safeInput = sanitizeInput(userInput);

console.log(safeInput); // Salida segura sin ejecución de script

Al sanitizar la entrada, evitamos que el navegador ejecute código malicioso.

Buenas Prácticas para Prevenir SQL Injection

  • Uso de consultas parametrizadas: Evita la concatenación de datos del usuario en las consultas SQL.
  • Validación y saneamiento de entradas: Asegurar que los datos ingresados sean del tipo esperado.
  • Principio del menor privilegio: Limitar los permisos de la base de datos para evitar acceso no autorizado.

Ejemplo de Prevención de SQL Injection en Python

Este código muestra cómo realizar una consulta segura usando parámetros en SQLite:

import sqlite3

def consultar_usuario(usuario_id):
    conn = sqlite3.connect("base_de_datos.db")
    cursor = conn.cursor()
    
    # Consulta segura usando parámetros
    cursor.execute("SELECT * FROM usuarios WHERE id = ?", (usuario_id,))
    usuario = cursor.fetchone()
    
    conn.close()
    return usuario

# Uso seguro
usuario_seguro = consultar_usuario(1)
print(usuario_seguro)

Al utilizar consultas parametrizadas, evitamos que datos malintencionados alteren la consulta SQL.

Conclusión

Prevenir vulnerabilidades como XSS y SQL Injection es esencial para garantizar la seguridad de las aplicaciones. Implementar prácticas seguras en el manejo de entradas y consultas reduce significativamente el riesgo de ataques.