2009-03-07 13 views
6

He creado una aplicación que usa jQuery y JSON para consumir un servicio web ASP.NET .asmx para realizar operaciones crud. La aplicación y .asmx están en el mismo dominio. ¡No me importa que la gente consuma las operaciones de lectura de .asmx de forma remota, pero no quiero que las personas eliminen cosas al azar!Bloquear llamadas de dominios cruzados al servicio web asp.net .asmx

Puedo dividir los métodos que me gustaría ser de acceso público y los 'ocultos' en 2 servicios web. ¿Cómo puedo bloquear las llamadas al servicio web 'hidden'.asmx' al mismo dominio en el que está alojado?

Gracias de antemano.

Editar: Puede alguien comentario sobre esta, parece plausible (fuente: http://www.slideshare.net/simon/web-security-horror-stories-presentation): Ajax puede establecer encabezados HTTP, formas normales peralte. Las solicitudes Ajax deben ser del mismo dominio.

Entonces las solicitudes "x-requested-with" "XMLHttpRequest" deben ser del mismo dominio.

+0

¿Tiene una pregunta específica sobre esa presentación? Todo definitivamente se usa para comprometer sitios, pero con protecciones básicas estás a salvo. –

+0

sí, es la parte donde dice que puede confiar en x-requested-with para decirle que es del mismo dominio y, por lo tanto, seguro. He hecho la misma pregunta hoy y estoy convencido de que cualquier encabezado http puede ser falso. no estoy muy seguro. de todos modos, he resuelto esto de otra manera (refactor importante) – jdee

+0

pero muchas gracias por su ayuda. Definitivamente me puso en el camino correcto para resolver mi problema del mundo real. – jdee

Respuesta

8

Hay dos escenarios que necesita para asegurar con los servicios web:

  1. autenticado el usuario?
  2. ¿La acción viene de mi página?

La pieza de autenticación ya está ocupada si está utilizando Autenticación de formularios. Si su servicio web se encuentra en un área protegida del sitio de autenticación de formularios, nadie podrá acceder a sus servicios web a menos que estén conectados.

El segundo escenario es una historia un poco más complicada. El ataque se conoce como CSRF o XSRF (Cross Site Request Forgery). Esto significa que un sitio web malicioso realiza acciones en nombre de su usuario mientras todavía están conectados a su sitio. Here's a great writeup on XSRF.

Jeff Atwood tipo de lo resume todo en el enlace anterior, pero en este caso es la protección XSRF en cuatro pasos:

  1. Escribir un GUID de cookies de su usuario.
  2. Antes de su llamada AJAX, lea este valor de la cookie y agréguela al servicio web POST.
  3. En el lado del servidor, compare el valor FORM con el valor de la cookie.
  4. Como los sitios no pueden leer las cookies de otro dominio, está seguro.
-1

En AJAX, el navegador realiza las llamadas, por lo que incluso si comprueba que el dominio es el mismo no sería lo suficientemente seguro porque puede ser fácilmente falsificado.

Debe usar algún tipo de token de autofesión/autharización (preferiblemente con un tiempo de espera) para mantener las cosas seguras.

+0

puede elaborar? ¿Cómo podría el sistema de tokens que mencionas? – jdee

+0

> que debería ser '¿cómo puedo crear el sistema de token que mencionas?' gracias – jdee

+0

Tiene que emitir una clave que el ajax tiene que devolver cuando el usuario solicita una operación crud. Esta clave debe caducar después de un corto período de tiempo, de esta forma solo las páginas que se generaron desde su servidor tienen la clave y pueden realizar las operaciones. – Sruly

-1

La solución rápida y sucia sería usar restricciones de direcciones IP para permitir solo el acceso a la dirección IP de su dominio a través de IIS.

Probablemente sería mejor utilizar la autenticación HTTP. Hay muchas maneras de hacer esto, encontré Authentication in ASP.NET Web Services una visión general útil.

Cuestiones relacionadas