PHP: transferir datos de un sitio a otro sitio de forma segura

Tengo un sitio que puede recibir solicitudes de varios sitios. Algo así como un cheque de actualización. Estos sitios enviarán información como nombres de usuario, contraseñas, versión de la aplicación, etc., luego mi sitio enviará una respuesta basada en esta información.

Básicamente, esta es una solicitud $_GET , algo así como:

http://www.mysite.com/?user=boo&password=foo&version=4

Me preguntaba si habría problemas de seguridad haciendo cosas como esta. ¿Podrían estos datos ser “interceptados” de alguna manera?

Bueno, yo recomendaría no enviar el nombre de usuario / contraseña a través de texto sin formato bajo ninguna circunstancia (incluso bajo SSL). En cambio, sugeriría usar una forma de autenticación Digest.

En cambio, sugeriría generar un token de autenticación grande (una cadena aleatoria de gran tamaño, 128 caracteres funcionarían). Luego, los usuarios instalarían este “token” en su aplicación.

Ahora, cuando la aplicación busca actualizaciones, primero activa una solicitud a su servidor solicitando un token de resumen. Este es un token de uso aleatorio que se usa solo una vez para una sola solicitud. Su aplicación debe generar un token, almacenarlo en un formato duradero (archivo, memoria, base de datos, etc.) junto con la marca de tiempo y luego devolverlo.

Ahora, su aplicación recibe este token de resumen (llamado $dt aquí). Luego, lo haces con el token de autenticación preconfigurado que ya se proporcionó.

 $authBit = $username . ':' . $authToken; $hash = hash_hmac('sha256', $authBit, $digestToken); $authField = $username . ':' . $hash . ':' . $digestToken; 

Luego, envía $authField al servidor. El servidor dividirá las partes:

 list ($user, $hash, $digestToken) = explode(':', $authField); 

Ahora, primero busca el token de autenticación del usuario en la base de datos y lo almacena en $authToken . Luego, $digestToken el $digestToken para asegurarse de que existe y que fue creado hace menos de 60 segundos (puede ajustarlo si es demasiado corto, pero no lo hace mucho más). De cualquier manera, elimínelo de la base de datos en este punto (para evitar que se reutilice).

Ahora, si el $digestToken existe y es válido, y puede encontrar un $authToken , simplemente haga la siguiente comprobación:

 $stub = $user . ':' . $authToken; if ($hash == hash_hmac('sha256', $stub, $digestToken)) { //valid user } else { //Not valid } 

Tiene la ventaja de cambiar el token enviado cada solicitud http única (cualquiera que lea la secuencia de solicitud no podrá obtener ninguna información sensible de la solicitud, que no sea el nombre de usuario que podría enmascarar más si lo desea) …

La oscuridad de seguridad no funciona, y usar POST en lugar de GET solo hace que la información sea un poco más difícil de arrebatar si realmente estás mirando al usuario por encima del hombro.

El verdadero problema aquí es evitar que las personas intercepten el tráfico en tránsito entre los servidores. La única forma de lidiar con eso es el cifrado, como SSL. Es una buena idea tratar de usar SSL siempre que esté transmitiendo información confidencial como contraseñas. Esto puede ser un poco más difícil de implementar, pero definitivamente vale la pena en términos de seguridad.

Sin embargo, la mejor manera de evitar que se arrebaten los datos confidenciales es no transmitirlos en primer lugar. Considere si es una opción que su aplicación busque actualizaciones sin transmitir una contraseña. Si hay una actualización disponible, puede enviar al usuario a una página web usando HTTPS para descargar la actualización, lo que le ahorra la molestia de implementar SSL usted mismo.

Utilice .htaccess para modificar y ocultar la URL de su sitio web. p.ej:

 www.mysite.com/index.php?cat=1234&foo=5678 

se verá como:

 www.mysite.com/cat-1234-foo-5678-index.html 

cuando creas con éxito el archivo .htaccess, ambas URL actuarán de la misma manera.