Hii,¿Cómo protegerse de la alteración de la cadena de consulta?
Tengo una cadena de consulta como "http://project/page1.aspx?userID=5". La operación no se realizará si el parámetro 'ID de usuario' cambió manualmente. ¿Como es posible?
Hii,¿Cómo protegerse de la alteración de la cadena de consulta?
Tengo una cadena de consulta como "http://project/page1.aspx?userID=5". La operación no se realizará si el parámetro 'ID de usuario' cambió manualmente. ¿Como es posible?
Hii todo, gracias por su ayuda ... y obtuve algún tipo de solución de diferencia de otros sitios. No sé cuál es la mejor solución. es codificar el valor usando un algoritmo de cifrado y descifrado ... El código de muestra se ha escrito así ...
<a href='Page1.aspx?UserID=<%= HttpUtility.UrlEncode(TamperProofStringEncode("5","F44fggjj")) %>'>
Click Here</a> <!--Created one anchor tag and call the function for TamperProofStringEncode-->
private string TamperProofStringEncode(string value, string key)
{
System.Security.Cryptography.MACTripleDES mac3des = new System.Security.Cryptography.MACTripleDES();
System.Security.Cryptography.MD5CryptoServiceProvider md5 = new System.Security.Cryptography.MD5CryptoServiceProvider();
mac3des.Key = md5.ComputeHash(System.Text.Encoding.UTF8.GetBytes(key));
return Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(value)) + "-" + Convert.ToBase64String(mac3des.ComputeHash(System.Text.Encoding.UTF8.GetBytes(value)));
}
En la carga de la página de 'Página1' llamar el algoritmo de decodificación para decodificar la cadena de consulta
try
{
string DataString = TamperProofStringDecode(Request.QueryString["UserID"], "F44fggjj");
Response.Write(DataString);
}
catch (Exception ex)
{
Response.Write(ex.Message);
}
private string TamperProofStringDecode(string value, string key)
{
string dataValue = "";
string calcHash = "";
string storedHash = "";
System.Security.Cryptography.MACTripleDES mac3des = new System.Security.Cryptography.MACTripleDES();
System.Security.Cryptography.MD5CryptoServiceProvider md5 = new System.Security.Cryptography.MD5CryptoServiceProvider();
mac3des.Key = md5.ComputeHash(System.Text.Encoding.UTF8.GetBytes(key));
try
{
dataValue = System.Text.Encoding.UTF8.GetString(Convert.FromBase64String(value.Split('-')[0]));
storedHash = System.Text.Encoding.UTF8.GetString(Convert.FromBase64String(value.Split('-')[1]));
calcHash = System.Text.Encoding.UTF8.GetString(mac3des.ComputeHash(System.Text.Encoding.UTF8.GetBytes(dataValue)));
if (storedHash != calcHash)
{
//'Data was corrupted
throw new ArgumentException("Hash value does not match");
// 'This error is immediately caught below
}
}
catch (Exception ex)
{
throw new ArgumentException("Invalid TamperProofString");
}
return dataValue;
}
Todavía creo que puede salirse con la suya con el uso de la sesión. Pero si, por alguna razón, el rally absolutamente ** necesita ** para hacer esto a través de la cadena de consulta y está dispuesto a seguir ese camino, probablemente funcione de esa manera. Sin embargo, todavía tengo un olor nauseabundo en la boca. Todavía depende ... ** ¿Por qué ** quieres esto o ** qué exactamente ** quieres lograr? Es posible que esté en la pista incorrecta ... – scherand
Mi uso es, he enviado un correo con el contenido de un enlace junto con la identificación del usuario. Cuando haga clic en el enlace en el correo navegará a la página y luego la página mostrará los detalles del usuario en particular –
No se puede decir si se ha cambiado manualmente. Si utiliza cadenas de consulta, entonces debe asegurarse de que no importa si se cambia. p.ej. si lo está usando para mostrarle a un usuario los detalles de su cuenta, debe verificar si el usuario seleccionado es el usuario actual y mostrar un mensaje de error en lugar de los datos del usuario, si no es así.
Solo quiero agregar: ASP.NET tiene una sesión, almacena información sobre quién está conectado allí e ingresa tu código si el usuario conectado puede ver los datos – Felix
Claro que puedes. Hash o encriptar la cadena de consulta utilizando una clave secreta compartida, incluir ese valor hash o encriptado en la cadena de consulta, y luego recalcularlo y verificar que coincida antes de usar la cadena de consulta. – xr280xr
Parece un requisito extraño. ¿Estás tratando de implementar algún tipo de seguridad interna? Si es así, realmente no deberías.
De todos modos, una forma de hacerlo podría ser tomar toda la url http://project/page1.aspx?userID=5
y calcular su md5 sum. A continuación, agregue la suma md5 a la url final, como http://project/page1.aspx?userID=5&checksum=YOURCALCULATEDMD5SUM
. Luego en page1.aspx tendrá que validar que el parámetro de suma de verificación es correcto.
Sin embargo, este enfoque es bastante ingenuo y no necesitaría mucho tiempo para que cualquiera descubra el algoritmo que ha utilizado. Si lo hicieran, podrían "fácilmente" cambiar el ID de usuario y calcular una suma md5 ellos mismos. Un enfoque más robusto sería aquel en el que la suma de comprobación se cifraba mediante una clave a la que solo usted tenía acceso. Pero nuevamente tengo que cuestionar su motivo para querer hacer esto, porque existen otras soluciones de seguridad que son mucho mejores.
¿No sería esto muy parecido a lo que hace una sesión (token) "gratis" en ASP.NET? Da al usuario un Id más o menos aleatorio/sin sentido (la identificación/token de la sesión) que luego se usa para identificar los datos correspondientes (de sesión). ¿Me equivoco? – scherand
@scherand: Más o menos ... En su caso, los datos reales se almacenarán en el servidor, mientras que en este caso los datos (ID de usuario = 5) se almacenan en la URL. Puede marcarse como favorito, no causará problemas si tiene varias páginas abiertas al mismo tiempo, etc. –
... lo cual muestra un buen punto. Si los usuarios obtienen acceso a esa URL, entonces no hay forma de eliminar más adelante ese acceso sin implementar un mecanismo de inicio de sesión/permisos o cambiar el algoritmo de suma de comprobación. –
Bueno - Depende :)
Una posibilidad es poner el userID
en una variable de sesión. Entonces el usuario no puede ver o editar el valor.
Si tiene otros medios para detectar si el valor es no válido (es decir, no existe o no puede ser para ese usuario (a quien puede identificar de otra manera) o similar) puede validar el ingrese usted mismo en el código detrás.
Pero como probablemente sepa, no puede evitar que el usuario cambie la cadena de consulta.
No puede.
Cualquier cosa en la solicitud HTTP (incluyendo URL, cadena de consulta, cookies, ...) está bajo el control del cliente y es fácil de falsificar.
Es por eso que es importante incluir en la lista blanca contenido válido, ya que el cliente puede agregar arbitrariamente lo que quiera, además de lo que usted solicite recibir.
Creo que el OP es consciente de que (s) no puede ** evitar ** que el usuario cambie la cadena de consulta. Pero, hasta cierto punto, (s) él podría ** proteger ** la aplicación de una cadena de consulta tan alterada. Y de eso es de lo que creo que se trata la pregunta. Solo mis dos peniques. – scherand
Si el usuario puede cambiar el registro 5, pero no grabar 7, por ejemplo, esto tiene que hacerse cumplir en el lado del servidor. Para hacer esto, debe ser capaz de identificar al usuario, requiriendo un inicio de sesión, y dándole una clave de sesión única que se almacena en su cookie del navegador, o como otro parámetro en la cadena de consulta url.
Hay abundantes paquetes/módulos/bibliotecas en idiomas hombre para hacer frente a la autenticación y sesiones de una manera sensata - rollo es el propietario a su propio riesgo :)
Mi favorito es t el siguiente. Utiliza un módulo HTTP para codificar y decodificar transparentemente la Querystring con el objetivo explícito de para evitar el sabotaje de la cadena de consulta.
http://www.mvps.org/emorcillo/en/code/aspnet/qse.shtml
Es perfecto cuando la sesión no es una opción!
Aquí hay otra opción que he encontrado muy útil para mis requisitos:
4 Guys From Rolla - Passing Tamper-Proof QueryString Parameters
Sólo para tipo de aclarar - Supongo que en su escenario que ya ha servido la página cabo; alguien hizo clic en un botón en otro lugar y llegó a la página "http: //project/page1.aspx? userID = 5". Y ahora en esta página van a escribir algunos valores y no quiere que cambien ese 5 en la barra de direcciones por un 7, pulse "guardar" y haga que su sitio web actualice la información del usuario 7, ¿correcto? – Tom