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? # trueSanitizació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" # trueAutorizació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
Commentque tenga un atributocontent. - Implementa un método
sanitize_contentque 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
Adminque herede deUser. - Implementa un método
admin?que retornetruesi 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? # trueConclusió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
