php - manejo - Sugerencias sobre cookies firmadas en lugar de sesiones
manejo de sesiones en php (3)
Estoy considerando abandonar PHP $_SESSION
(es decir, el manejo de sesión del lado del servidor, para agregar un sabor agnóstico del idioma) y usar cookies firmadas, ya que he escuchado mucho sobre ellos (Flickr los usa, por lo que deberían ser lo suficientemente bueno para mí también).
Entiendo el contexto básico de la técnica: use cookies libremente para pasar pares clave-valor de cliente a servidor, y fírmelas para asegurarse de que los valores no se manipulen.
Pero, ¿cuál sería una buena forma de implementar la parte de firma? También; dado que el tráfico probablemente será HTTP, ¿hay alguna manera de enviar datos confidenciales (como la contraseña de un usuario) con este método, mientras se trabaja contra el robo de cookies y / o la manipulación?
¿Por qué molestarse?
No usaría esta técnica para datos confidenciales. Sin embargo, puede ser útil en combinación con una sesión regular: puedes darle al cliente una cookie con una identificación de sesión normal, pero también incluir todos los pares clave / valor que tu aplicación necesita en cada página. De esta manera, puede evitar golpear el almacenamiento de su sesión para cada solicitud de página.
Debería tratar de mantener la cantidad de datos bastante ajustados, ya que se enviará con cada solicitud.
Con eso en mente, en adelante ...
Firma de datos con un hash
Si los datos no son confidenciales, puede firmar los valores con hash sha1 a partir de una combinación de los pares clave / valor y un secreto compartido. p.ej
$values=array(
''user_id''=>1,
''foo''=>''bar''
);
$secret=''MySecretSalt'';
$plain="";
foreach($values as $key=>$value)
{
$plain.=$key.''|''.$value.''|'';
}
$plain.=$secret;
$hash=sha1($plain);
Ahora dale al cliente una cookie con todos los valores y el hash. Puede verificar el hash cuando se presente la cookie. Si el hash que calcula a partir de los valores presentados por el cliente no coincide con el hash esperado, sabe que los valores han sido alterados.
Cifrado de datos confidenciales
Para datos confidenciales, deberá encriptar los valores. Mira la extensión mcrypt que ofrece muchas funciones criptográficas.
Robo de cookies
Con respecto al robo de cookies, si está colocando credenciales de usuario en una cookie y confiando en ella, alguien que obtenga esa cookie puede suplantar a ese usuario hasta que se cambie la contraseña. Una buena práctica es recordar cómo autenticó a un usuario y solo otorgar ciertos privilegios si el usuario inició sesión explícitamente. Por ejemplo, para un foro, puede dejar que alguien publique, pero no cambiar los detalles de su cuenta como la dirección de correo electrónico.
Existen otras técnicas para las cookies "autologin", que implican otorgar a dichas cookies un valor de token que solo permite utilizar una vez. Aquí hay un buen artículo sobre esa técnica.
También podría considerar incluir la IP del cliente en una cookie firmada, y si no coincide con la IP que presenta la cookie, conseguirá que inicie sesión de nuevo. Esto proporciona más protección, pero no funcionará para las personas cuya aparente dirección IP sigue cambiando. Podrías convertirlo en una función opcional y darle al usuario una forma de optar por no participar. Sólo un pensamiento ocioso, no he visto eso hecho en la práctica :)
Para ver un buen artículo que explica el robo, secuestro y fijación de sesión, consulte Sesiones y cookies, que ofrece algunas técnicas más para probar, como usar el encabezado User-Agent como una firma adicional.
Hice CookieStorage exactamente para este propósito. Todos los valores almacenados se firman de forma segura con su clave privada a través de hash RIPEMD160 (y salados con el tiempo), y opcionalmente cifrados con RIJNDAEL256.
Cada valor se almacena con la marca de tiempo, que es recuperable.
Ejemplo firmado .
Ejemplo encriptado
Si lo prefiere, puede usar las funciones hash / encrypt / decrypt de su elección.
Cookies firmadas en PHP
Las otras respuestas a esta pregunta están un poco desactualizadas. PHP 5.2 agregó el parámetro httponly
a la función setcookie
, agregando efectivamente el soporte nativo de cookies firmado. De acuerdo con la función setcookie httponly parámetro de documentación :
"Cuando [se establece en] TRUE, la cookie se hará accesible solo a través del protocolo HTTP. Esto significa que la cookie no será accesible mediante los lenguajes de scripting, como JavaScript. Se ha sugerido que esta configuración puede ayudar a reducir la identidad robo a través de ataques XSS (aunque no es compatible con todos los navegadores), pero ese reclamo a menudo se disputa ".
Establecer este parámetro en true también desactivará la capacidad de editar esta cookie utilizando otras herramientas basadas en el navegador, como DevTools de Chrome. Para que la cookie firmada sea aún más segura, le recomiendo que reduzca la ruta o el dominio que utiliza. Puede especificar aquellos que usan la path
y domain
parámetros del domain
. Y, por supuesto, nunca está de más proteger la cookie con el parámetro de secure
si su sitio web se está cargando a través de HTTPS. El resultado será una línea como esta:
setcookie(''signedCookie'',''uneditable value here'', 0, ''/'', ''www.example.com'', TRUE , TRUE);
¿Por qué usar cookies firmadas?
De hecho, hay situaciones específicas en las que las cookies firmadas son útiles, mientras que otros métodos, como una sesión, no lo son. Por ejemplo, supongamos que el sitio web / aplicación en cuestión utiliza un equilibrador de carga para mejorar el rendimiento. Ahora supongamos también que el equilibrador de cargas tiene varios servidores físicos desde los cuales se sirven los archivos y una opción de sesión adhesiva no está disponible. En tal situación, las cookies firmadas son prácticamente la única forma segura de preservar el estado en PHP.