2012-02-20 15 views
8

Necesito almacenar una pequeña porción de datos (menos de 10 caracteres) en una cookie en Rails y necesito que sea segura. No quiero que nadie pueda leer ese dato o inyectar su propia información (ya que eso abriría la aplicación a muchos tipos de ataques). Creo que el encriptado del contenido de la cookie es el camino a seguir (¿debería firmarlo también?). ¿Cuál es la mejor manera de hacerlo?Almacenamiento de una cookie cifrada con Rails

En este momento estoy haciendo esto, que parece seguro, pero muchas cosas parecían seguras para las personas que sabían mucho más que yo sobre seguridad y luego se descubrió que no era realmente seguro.

estoy ahorrando el secreto de esta manera:

encryptor = ActiveSupport::MessageEncryptor.new(Example::Application.config.secret_token) 
cookies[:secret] = { 
    :value => encryptor.encrypt(secret), 
    :domain => "example.com", 
    :secure => !(Rails.env.test? || Rails.env.development?) 
} 

y luego lo estoy leyendo la siguiente manera:

encryptor = ActiveSupport::MessageEncryptor.new(Example::Application.config.secret_token) 
secret = encryptor.decrypt(cookies[:secret]) 

¿Eso es seguro? ¿Alguna mejor forma de hacerlo?

actualización: lo que sé de la sesión de Rails y cómo es seguro, tanto mediante la firma de la cookie y opcionalmente mediante el almacenamiento de los contenidos del lado del servidor sesión y hacer uso de la sesión por lo que es para. Pero mi pregunta aquí es sobre el almacenamiento de una cookie, una información que no quiero en la sesión, pero aún necesito que sea segura.

+0

Fuera de interés, ¿por qué necesita almacenarse en una cookie en lugar de en el lado del servidor, donde sería por definición más segura? – Russell

+0

@russell bien, necesitas guardar algo en el navegador, ¿verdad? de lo contrario, no podría identificarlo nuevamente. Ya se trate de los datos reales o una identificación de un registro en una tabla, es una cuestión de preferencia y necesidad con respecto al tamaño de los datos y otras consideraciones. Lo que estoy almacenando ya es la identificación de un registro en la tabla. Podría crear otra tabla, pero parece una pérdida en este caso. – Pablo

+0

Agregué una respuesta porque creo que cambiar el almacén de sesión predeterminado para utilizar el DB le dará la seguridad que desea con muy poca sobrecarga en lo que respecta a la creación de tablas, etc. – Russell

Respuesta

0

Estoy volviendo a publicar la respuesta de JacobM, que eliminó, porque era la respuesta correcta y me indicó la dirección correcta. Si lo deshace, lo eliminaré y elegiré el suyo como la mejor respuesta.

En primer lugar, si se utiliza en lugar de encrypt_and_verifyencrypt se firmar la cookie para usted.

Sin embargo, cuando se trata de seguridad, siempre prefiero confiar en las soluciones que han sido examinadas en público, en lugar de hacerlas mías. Un ejemplo sería el encrypted-cookies gem.

+0

Tengo curiosidad por saber por qué no usarías las cookies firmadas (compatible por defecto en Rails 3.x) –

+1

@KandadaBoggu Las cookies procesadas por encrypt_and_verify o la joya de las cookies cifradas (post 1.0) están firmadas, pero también están encriptadas. No sería tan grave si este dato se expone, pero prefiero no pensarlo y mantenerlo seguro cifrado, por lo tanto, opaco para el usuario. – Pablo

+0

Eso tiene sentido ... –

13
  • creando una cookie segura

    cookies.signed[:secret] = { 
    :value => "foo bar", 
    :domain => "example.com", 
    :secure => !(Rails.env.test? || Rails.env.development?) 
    } 
    
  • Acceso a la cookie

    cookies.signed[:secret] # returns "foo bar" 
    

La cookie se firma usando ActionController::Base.cookie_verifier_secret. Puede configurar el cookie_verifier_secret en el archivo de inicializador.

+0

No quiero usar la sesión. Mis sesiones son por dominio (blah.ejemplo.com) mientras que esta información es para todo el sistema (.example.com), de ahí la opción de dominio cuando se configura. – Pablo

+0

Actualizada la respuesta eche un vistazo. –

+0

Las cookies establecidas con .signed deben accederse con .signed también. Por lo tanto, su segundo bloque de código debe ser 'cookies.signed [: secret]'. –

1

Como dice KandadaBoggu, parece que lo que desea es una variable de sesión, y las variables de sesión se cifran y almacenan de forma predeterminada en las cookies. Sin embargo, si usted tiene un vistazo a los contenidos de config/initializers/session_store.rb encontrará algo como lo siguiente:

# Be sure to restart your server when you modify this file. 
MyRailsApp::Application.config.session_store :cookie_store, :key => '_my_rails_app_session' 

# Use the database for sessions instead of the cookie-based default, 
# which shouldn't be used to store highly confidential information 
# (create the session table with "rails generate session_migration") 
# MyRailsApp::Application.config.session_store :active_record_store 

¿Qué me sugiere que se debe utilizar la base de datos para las sesiones en lugar de la opción predeterminada basada en cookies, que no deben' t se usará para almacenar información altamente confidencial. La migración precocida hace que todo sea realmente fácil de configurar, por lo que hay muy poco sobrecarga, y una vez hecho, básicamente no hay gastos generales si necesita agregar una nueva información secreta en una fecha posterior.

+0

No quiero usar la sesión. Mis sesiones son por dominio (blah.ejemplo.com) mientras que esta información es para todo el sistema (.example.com), de ahí la opción de dominio cuando se configura. – Pablo

Cuestiones relacionadas