Logo de CursoIA
CursoIA Curso de Inteligencia Artificial

Prompt engineering para programación, Unidad 8 — Seguridad y buenas prácticas, 8.2 — Prompts seguros ·

Evitar funciones peligrosas

Evitar funciones peligrosas

Introducción

En el mundo de la programación, las funciones peligrosas pueden ser un riesgo significativo para la seguridad y la integridad del código. Estos son bloques de código que podrían llevar a vulnerabilidades de inyección, manejo incorrecto de datos o dependencias potencialmente dañinas. En este artículo, exploraremos por qué es importante evitar estas funciones peligrosas, proporcionaremos ejemplos concretos y discutiremos errores comunes al tratar con ellas. Además, ofreceremos una lista de verificación para ayudarte a mantener un código seguro.

Explicación principal con ejemplos

Cuando se habla de funciones peligrosas en el contexto del desarrollo de software, nos referimos a aquellas que pueden causar daños o vulnerabilidades si no se usan correctamente. Algunos ejemplos incluyen:

Ejemplo 1: Inyección SQL

La inyección SQL ocurre cuando un atacante puede insertar código SQL en una consulta preparada, lo que puede llevar a la recuperación de datos sin autorización.

def get_user_data(user_id):
    query = f"SELECT * FROM users WHERE id={user_id}"
    result = execute_query(query)
    return result

# Ejemplo de uso inseguro
get_user_data("1' OR '1'='1")

Ejemplo 2: Inyección en JavaScript (XSS)

La inyección de scripts en contexto de usuario (Cross-Site Scripting, XSS) ocurre cuando un atacante puede insertar código malicioso que se ejecuta en el navegador del usuario.

<div id="user_message"></div>
<script>
document.getElementById('user_message').innerHTML = '<script>alert("XSS")</script>';
</script>

# Ejemplo de uso inseguro
message = "<script>alert('Inyección XSS')</script>"
display_message(message)

Ejemplo 3: Uso de funciones obsoletas en lenguajes como C/C++

En C y C++, algunas funciones obsoletas pueden ser peligrosas debido a su manejo erróneo de memoria. Por ejemplo, strcpy es potencialmente vulnerable al desbordamiento de búfer.

#include <stdio.h>

void unsafe_function(char* str) {
    char buffer[50];
    strcpy(buffer, str);  // Vulnerable al desbordamiento de búffer
}

int main() {
    unsafe_function("A" "B" "C" "D" "E" "F" "G" "H" "I" "J" "K" "L" "M" "N" "O" "P" "Q" "R" "S" "T" "U" "V" "W" "X" "Y" "Z");
    return 0;
}

Errores típicos / trampas

  1. Ignorar el uso de parámetros preparados en SQL:
  • Error: Usar consultas directas en lugar de consultas preparadas.
  • Trampa: No se validan o escapan los datos correctamente.
  1. No validar entrada del usuario:
  • Error: Permitir que el usuario ingrese cualquier tipo de texto sin filtrarlo.
  • Trampa: Los datos maliciosos pueden ser ejecutados en el contexto del código.
  1. Uso inseguro de funciones obsoletas:
  • Error: Continuar usando funciones obsoletas como strcpy o gets.
  • Trampa: Estas funciones no controlan el tamaño del búfer y pueden causar fallos graves.

Checklist accionable

  1. Utilizar consultas preparadas en lugar de ejecutar consultas directamente.
  2. Validar toda entrada del usuario, especialmente si se utiliza en contexto de SQL o JavaScript.
  3. Evitar el uso de funciones obsoletas y preferir alternativas seguras.
  4. Usar herramientas de análisis estático para detectar posibles inyecciones y vulnerabilidades.
  5. Documentar todas las funciones peligrosas utilizadas en el código, junto con su propósito y riesgos asociados.

Cierre

En resumen, evitar funciones peligrosas es crucial para mantener un sistema seguro y robusto. Siempre es importante validar y escapar los datos correctamente, usar consultas preparadas, y preferir funciones seguras sobre las obsoletas. Además, la documentación y el uso de herramientas de análisis estático pueden ayudarte a identificar y mitigar riesgos potenciales.

Siguientes pasos

  • Analizar tu código actual para identificar posibles inyecciones o vulnerabilidades.
  • Implementar consultas preparadas en todas las interacciones con bases de datos.
  • Usa herramientas como OWASP ZAP o Dependabot para analizar y monitorear el estado de seguridad del código.

Siguiendo estos pasos, podrás asegurarte de que tu código no solo sea funcional, sino también seguro.

Contacto

Indica tu objetivo (ChatGPT, RAG, agentes, automatización) y tu stack (web/backend).