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

  1. Validación y Sanitización de Datos
  2. Gestión de Autenticación y Autorización
  3. Protección contra Inyección de Código
  4. Manejo Seguro de Sesiones
  5. Cifrado y Almacenamiento Seguro de Datos
  6. Protección contra Ataques de Fuerza Bruta
  7. Actualización y Mantenimiento de Dependencias

  1. 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 # &lt;script&gt;alert(&#39;XSS&#39;);&lt;/script&gt;

  1. 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

  1. 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.

user_input = "file.txt; rm -rf /"
system("cat #{Shellwords.escape(user_input)}")

  1. 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?

  1. 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

  1. 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

  1. Actualización y Mantenimiento de Dependencias

Mantén las Dependencias Actualizadas

Utiliza herramientas como bundler-audit para verificar vulnerabilidades en las gemas.

gem install bundler-audit
bundler-audit check --update

Ejercicio Práctico

Ejercicio 1: Validación y Sanitización

  1. Crea una clase Comment que tenga un atributo content.
  2. 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 # &lt;script&gt;alert(&#39;XSS&#39;);&lt;/script&gt;

Ejercicio 2: Autenticación y Autorización

  1. Crea una clase Admin que herede de User.
  2. Implementa un método admin? que retorne true 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.

© Copyright 2024. Todos los derechos reservados