2008-10-29 18 views
5

¿Cómo se asegura adecuadamente que un usuario no altere los valores de la cadena de consulta o los valores de la URL de acción? Por ejemplo, puede tener una acción Eliminar comentario en su CommentController que toma un CommentID. La url de acción podría verse como/Comments/Delete/3 para eliminar el comentario con el id 3.Seguridad con los valores de QueryString en Asp.net MVC

Ahora, obviamente, no desea que nadie pueda eliminar el comentario 3. Normalmente, el propietario del comentario o un administrador tiene permiso para hacerlo He visto esta seguridad impuesta de diferentes maneras y me gustaría saber cómo algunos de ustedes lo hacen.

¿Realiza varias llamadas a la base de datos para recuperar el comentario y comprobar que el autor del comentario coincide con el usuario que invoca la acción de eliminación?

En su lugar, transfiere el ID de comentario y el ID de usuario al procedimiento almacenado que realiza la eliminación y realiza una eliminación donde ID de usuario e ID coinciden con los valores pasados?

¿Es mejor encriptar los valores de cadena de consulta?

Respuesta

18

No es así.

Es una regla fundamental de la programación, especialmente en este día y edad, que nunca confía en cualquier entrada que viene del usuario, el navegador, el cliente, etc.

También es un cardenal regla de programación que probablemente no deberías tratar de implementar el cifrado y la seguridad tú mismo, a menos que realmente sepas lo que estás haciendo. E incluso si sabes lo que estás haciendo, solo estarás un paso por delante de los crackers tardíos. Los más inteligentes todavía se reirán de ti.

Realice la consulta adicional para asegurarse de que el usuario que ha iniciado sesión tiene el conjunto correcto de permisos. Eso hará que las vidas de todos sean mucho más simples.

0

que he hecho cosas cobardes toman la cadena de consulta, comprimirlo, Base64 o simplemente hexagonal codificarlo, por lo que "commentid = 4 & identificador de usuario = 12345" se convierte en "código = 1a2b23de12769"

Se trata básicamente de "seguridad a través oscuridad "pero hace mucho trabajo para alguien que intenta hackear el sitio.

0

No puede hacer esto fácilmente.

Tengo buenos recuerdos de un sitio que usó URL de acción para hacer eliminaciones.

Todo estuvo bien hasta que comenzaron la búsqueda rastreando la intranet.

Ooops, datos de adiós.

Recomendaría una solución por la cual no use las cadenas de consulta para nada que no desee editar.

+0

Entonces, ¿cómo sugieres que editar/borrar cosas ¿entonces? Tenga en cuenta que estoy usando Asp.net MVC – Vyrotek

+0

Debería estar POSTING a sus métodos de controlador para invocar una eliminación y verificar las credenciales de solicitud (cookie/nombre de usuario/contraseña/lo que sea) antes de realizar la eliminación. Ver la publicación de @Schotime. –

1

También puede permitir solo las solicitudes de envío para eliminar la acción del controlador utilizando el atributo Aceptar verbos como se ve a continuación.

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Delete(int? id) 
{ 
    //Delete 
} 

A continuación, también se puede utilizar el token antiforgery como se discute aquí:

http://blog.codeville.net/2008/09/01/prevent-cross-site-request-forgery-csrf-using-aspnet-mvcs-antiforgerytoken-helper/

+1

En MVC 2.0 también puede invocar Http delete. Simplemente ponga [HttpDelete] en lugar de [HttpPost] en su acción y luego envíe el formulario usando el protocolo de eliminación en lugar de la publicación. – Josh

3

Vyrotek: El método de entrada no es importante. GET, POST, GET encriptado/ofuscado - no hay diferencia real.Sin importar la forma en que su aplicación reciba comandos, para realizar una acción administrativa, debe asegurarse de que el usuario emisor pueda hacer las cosas que desea. La verificación de permisos debe tener lugar DESPUÉS de que se reciba el comando y ANTES de que se ejecute. De lo contrario, no hay seguridad en absoluto.

6

Enrypting y descifrar params consulta es un proceso trivial y hay algunos grandes ejemplos de cómo hacerlo a través de una HttpModule aquí en StackOverflow.

"no", "no se puede", o "No es fácil" son respuestas simplemente no es aceptable en este día y edad ...

Cuestiones relacionadas