La seguridad es un aspecto crucial en el desarrollo de software, especialmente en aplicaciones web. En este módulo, aprenderás las mejores prácticas de seguridad en Ruby para proteger tus aplicaciones contra vulnerabilidades comunes.
Conceptos Clave
- Validación y Sanitización de Datos
- Gestión de Autenticación y Autorización
- Protección contra Inyección de Código
- Manejo Seguro de Sesiones
- Cifrado y Almacenamiento Seguro de Datos
- Protección contra Ataques de Fuerza Bruta
- Actualización y Mantenimiento de Dependencias
- Validación y Sanitización de Datos
Validación de Datos
La validación de datos asegura que los datos ingresados por los usuarios cumplan con ciertos criterios antes de ser procesados.
class User attr_accessor :email def initialize(email) self.email = email end def valid_email? !!(email =~ /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i) end end user = User.new("[email protected]") puts user.valid_email? # true
Sanitización de Datos
La sanitización de datos elimina o escapa caracteres peligrosos para prevenir ataques como XSS (Cross-Site Scripting).
require 'cgi' user_input = "<script>alert('XSS');</script>" sanitized_input = CGI.escapeHTML(user_input) puts sanitized_input # <script>alert('XSS');</script>
- Gestión de Autenticación y Autorización
Autenticación
La autenticación verifica la identidad del usuario. Utiliza gemas como bcrypt
para almacenar contraseñas de manera segura.
require 'bcrypt' password = BCrypt::Password.create("my_secret_password") puts password # $2a$12$... # Verificación stored_password = BCrypt::Password.new(password) puts stored_password == "my_secret_password" # true
Autorización
La autorización controla el acceso a recursos y acciones dentro de la aplicación.
class User attr_accessor :role def initialize(role) self.role = role end def admin? role == 'admin' end end user = User.new('admin') puts user.admin? # true
- Protección contra Inyección de Código
Inyección SQL
Utiliza consultas preparadas para prevenir inyecciones SQL.
require 'sqlite3' db = SQLite3::Database.new ":memory:" db.execute "CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT)" name = "Robert'); DROP TABLE users;--" db.execute "INSERT INTO users (name) VALUES (?)", [name]
Inyección de Comandos
Evita la ejecución de comandos del sistema con datos no confiables.
- Manejo Seguro de Sesiones
Configuración de Cookies Seguras
Configura las cookies para que sean seguras y solo accesibles a través de HTTPS.
# En Rails, config/initializers/session_store.rb Rails.application.config.session_store :cookie_store, key: '_your_app_session', secure: Rails.env.production?
- Cifrado y Almacenamiento Seguro de Datos
Cifrado de Datos
Utiliza gemas como openssl
para cifrar datos sensibles.
require 'openssl' cipher = OpenSSL::Cipher.new('AES-128-CBC') cipher.encrypt key = cipher.random_key iv = cipher.random_iv encrypted = cipher.update('Sensitive Data') + cipher.final puts encrypted
- Protección contra Ataques de Fuerza Bruta
Limitación de Intentos de Inicio de Sesión
Implementa una lógica para limitar los intentos de inicio de sesión.
class User attr_accessor :login_attempts def initialize self.login_attempts = 0 end def login(password) if login_attempts >= 5 puts "Account locked. Too many failed attempts." else # Verificar contraseña self.login_attempts += 1 end end end
- Actualización y Mantenimiento de Dependencias
Mantén las Dependencias Actualizadas
Utiliza herramientas como bundler-audit
para verificar vulnerabilidades en las gemas.
Ejercicio Práctico
Ejercicio 1: Validación y Sanitización
- Crea una clase
Comment
que tenga un atributocontent
. - Implementa un método
sanitize_content
que elimine cualquier etiqueta HTML del contenido.
class Comment attr_accessor :content def initialize(content) self.content = content end def sanitize_content self.content = CGI.escapeHTML(content) end end comment = Comment.new("<script>alert('XSS');</script>") comment.sanitize_content puts comment.content # <script>alert('XSS');</script>
Ejercicio 2: Autenticación y Autorización
- Crea una clase
Admin
que herede deUser
. - Implementa un método
admin?
que retornetrue
si el usuario es un administrador.
class User attr_accessor :role def initialize(role) self.role = role end def admin? role == 'admin' end end class Admin < User def initialize super('admin') end end admin = Admin.new puts admin.admin? # true
Conclusión
En esta sección, hemos cubierto las mejores prácticas de seguridad en Ruby, incluyendo la validación y sanitización de datos, la gestión de autenticación y autorización, la protección contra inyección de código, el manejo seguro de sesiones, el cifrado y almacenamiento seguro de datos, la protección contra ataques de fuerza bruta y la actualización y mantenimiento de dependencias. Estas prácticas son esenciales para construir aplicaciones seguras y robustas. Asegúrate de aplicarlas en tus proyectos para proteger tus aplicaciones y los datos de tus usuarios.
Curso de Programación en Ruby
Módulo 1: Introducción a Ruby
Módulo 2: Conceptos Básicos de Ruby
Módulo 3: Trabajando con Colecciones
Módulo 4: Programación Orientada a Objetos en Ruby
- Clases y Objetos
- Variables y Métodos de Instancia
- Variables y Métodos de Clase
- Herencia
- Módulos y Mixins
Módulo 5: Conceptos Avanzados de Ruby
- Bloques, Procs y Lambdas
- Metaprogramación
- Manejo de Excepciones
- Entrada/Salida de Archivos
- Expresiones Regulares
Módulo 6: Introducción a Ruby on Rails
- ¿Qué es Ruby on Rails?
- Configuración del Entorno Rails
- Creando una Aplicación Simple en Rails
- Arquitectura MVC
- Enrutamiento
Módulo 7: Pruebas en Ruby
- Introducción a las Pruebas
- Pruebas Unitarias con Minitest
- Desarrollo Guiado por Comportamiento con RSpec
- Mocking y Stubbing
Módulo 8: Mejores Prácticas en Ruby
- Estilo de Código y Convenciones
- Refactorización
- Optimización del Rendimiento
- Mejores Prácticas de Seguridad