El Anti-Patrón: "Hardcodear" Secretos
El error de seguridad más común y peligroso es escribir credenciales (usuarios, contraseñas, tokens) directamente en el código. Esto se conoce como "hardcodear".
¡NUNCA HAGAS ESTO!
El siguiente código es un ejemplo de una vulnerabilidad de seguridad crítica.
# ¡MALO! ¡INSEGURO! NO HACER.
con <- dbConnect(
    RPostgres::Postgres(),
    dbname = "icfes_prod",
    host = "123.45.67.89",
    port = 5432,
    user = "admin_icfes",
    password = "PasswordSeguro123!" # <-- ¡Credenciales expuestas!
)
¿Por qué es tan grave?
- Visibilidad Total: Cualquiera con acceso al código puede ver las credenciales en texto plano.
- Control de Versiones (Git): Si subes este código a un repositorio (incluso uno privado), las credenciales quedan registradas en el historial para siempre. ¡Un desastre de seguridad!
- Gestión Imposible: Si la contraseña cambia, tienes que editar el código, hacer pruebas y volver a desplegar toda la aplicación.
- Diferencia de Entornos: Es muy difícil manejar credenciales distintas para desarrollo, pruebas y producción.
La Solución Profesional: Variables de Entorno
La práctica estándar de la industria es separar la configuración del código. Las credenciales y otros "secretos" deben vivir fuera de tus scripts, en un lugar seguro que no se comparta en el control de versiones. En R, la mejor manera de lograr esto es usando el archivo .Renviron.
Este es un archivo especial que R lee automáticamente al iniciar, cargando las variables que contiene en el "entorno" del sistema.
Implementación en 3 Pasos
Paso 1: Crear y Editar el archivo `.Renviron`
La forma más fácil y segura de editar este archivo es usando el paquete usethis.
# Instala usethis si no lo tienes
# install.packages("usethis")
# Este comando abre el archivo .Renviron para que lo edites
usethis::edit_r_environ()
Se abrirá un archivo de texto. Aquí, define tus secretos con la sintaxis NOMBRE_VARIABLE="VALOR". No uses espacios alrededor del =.
Ejemplo de contenido para `.Renviron`:
# Credenciales para la Base de Datos de Producción
DB_HOST="123.45.67.89"
DB_USER="admin_icfes"
DB_PASS="PasswordSeguro123!"
# App Token para la API de Socrata (Datos Abiertos)
SOCRATA_APP_TOKEN="TU_TOKEN_AQUI_DE_DATOS_ABIERTOS"
Guarda el archivo. IMPORTANTE: Deberás reiniciar tu sesión de R (En RStudio: `Session > Restart R`) para que los cambios surtan efecto.
Paso 2: Asegurar el archivo en `.gitignore`
Este es el paso más crítico. Debemos decirle a Git que ignore el archivo `.Renviron` para que nunca se suba al repositorio.
Abre (o crea) el archivo .gitignore en la raíz de tu proyecto y añade la siguiente línea al final:
# Ignorar archivos de entorno que contienen secretos
.Renviron
Paso 3: Leer las Variables en el Código con `Sys.getenv()`
Ahora, en tu código R, puedes acceder a estas variables de forma segura usando la función Sys.getenv().
¡ESTE ES EL CÓDIGO SEGURO!
# ¡BUENO! ¡SEGURO!
con <- dbConnect(
    RPostgres::Postgres(),
    dbname = "icfes_prod",
    host = Sys.getenv("DB_HOST"),      # Lee el host del entorno
    port = 5432,
    user = Sys.getenv("DB_USER"),      # Lee el usuario del entorno
    password = Sys.getenv("DB_PASS")   # Lee la contraseña del entorno
)
# Para la API de Socrata
app_token <- Sys.getenv("SOCRATA_APP_TOKEN")
req <- request(api_base_url) %>%
    req_headers("X-App-Token" = app_token) # Añade el token a la cabecera
Este código es seguro para compartir y subir a Git. No contiene ninguna información sensible. Las credenciales reales solo existen en el archivo .Renviron local de la máquina donde se ejecuta la aplicación (tu computador de desarrollo, el servidor de producción, etc.).