¿Qué hace mejores-prácticas-de-seguridad-en-api?
Implementa patrones de diseño seguro de API que incluyen autenticación, autorización, validación de entrada, limitación de velocidad y protección contra vulnerabilidades comunes de API.
Autenticación
- Utilizar tokens JWT o sesiones OAuth2
- Almacenar tokens de forma segura (nunca en localStorage para aplicaciones web)
- Implementar rotación periódica de tokens
- Usar refresh tokens para mejorar la seguridad
Autorización
- Aplicar el principio de privilegio mínimo
- Validar la autorización en cada endpoint
- Utilizar roles y permisos (RBAC)
- Verificar la propiedad de los recursos
Validación de Entrada
- Validar todos los datos de entrada (whitelist de tipos de datos, longitudes, patrones)
- Sanitizar datos para prevenir inyección SQL, XSS, etc.
- Usar esquemas como JSON Schema para validación estructural
- Rechazar solicitudes malformadas con códigos de error 400
Limitación de Velocidad
- Implementar limitación de velocidad por IP, usuario o endpoint
- Utilizar algoritmos como Token Bucket, Leaky Bucket o ventana fija
- Devolver headers
X-RateLimit-LimityX-RateLimit-Remaining - Configurar límites basados en el caso de uso (ej: 100 req/min para usuarios autenticados)
Protección Contra Vulnerabilidades Comunes
Inyección SQL
- Usar consultas parametrizadas o ORMs
- Escapar correctamente las cadenas dinámicas
Cross-Site Scripting (XSS)
- Sanitizar datos de salida
- Establecer Content-Type y charset correctos
Cross-Site Request Forgery (CSRF)
- Utilizar tokens CSRF en formularios
- Verificar headers referer u origin
Otras Vulnerabilidades
- Implementar CORS correctamente
- Usar HTTPS/TLS en todas las comunicaciones
- Mantener las dependencias actualizadas
Ejemplo de Código
from flask import Flask, request, jsonify
from functools import wraps
import jwt
app = Flask(__name__)
app.config['SECRET_KEY'] = 'tu-clave-secreta'
def token_required(f):
@wraps(f)
def decorated(*args, **kwargs):
token = request.headers.get('Authorization')
if not token:
return jsonify({'message': 'Token requerido'}), 403
try:
data = jwt.decode(token, app.config['SECRET_KEY'], algorithms=['HS256'])
except:
return jsonify({'message': 'Token inválido'}), 403
return f(*args, **kwargs)
return decorated
@app.route('/api/protegida')
@token_required
def proteccion():
return jsonify({'message': 'Endpoint protegido accedido con éxito'})
if __name__ == '__main__':
app.run(debug=True)
Conclusión
Implementar estas mejores prácticas ayuda a construir APIs robustas y seguras, reduciendo el riesgo de violaciones de datos y mejorando la confianza del usuario. Revisa y actualiza periódicamente tus medidas de seguridad conforme evolucionan las amenazas.