2010-04-05 46 views
6

tengo http://example.com/index.html, que desde dentro del HTML utiliza JavaScript (XmlHttpRequest) para llamar a un servicio web en http://example.com/json/?a=...&b=...¿Cómo restringir el acceso a mi servicio web?

devuelve el servicio web para index.html una matriz JSON de la información que se muestra a continuación, en index.html.

ya que cualquiera puede ver el código fuente de index.html y ver cómo Voy a llamar al servicio web JSON (http://example.com/json/), ¿Cómo evito que la gente de llamar a mi servicio web JSON directamente?

Desde el servicio web es esencialmente un proceso abierto leer en mi base de datos, no quiero que la gente abuse del servicio web y empezar a traer los datos directamente desde el servicio web, iniciar DoS mi servidor, ir a buscar más información que que deberían, etc ..

ACTUALIZACIÓN:

¿no hay manera de limitar las solicitudes de http://example.com/json/ a sólo vienen desde el mismo servidor (IP) y la solicitud de URL de http://example.com/index.html?

Significado, no puede http://example.com/json/ detectar que el Solicitante es ($_SERVER['REQUEST_URI'] == http://example.com/index.html) y solo permite eso?

+2

Umm, hola? Esta es exactamente su pregunta que ya estamos respondiendo aquí: http://stackoverflow.com/questions/2576734/how-to-prevent-direct-access-to-my-json-service – Matchu

+0

@Matchu, es similar pero no es lo mismo (como incluso señaló el comentario de Joshua Smith sobre la publicación StackOverflow vinculada) – Hank

+0

"Cómo evitar el acceso directo a mi servicio JSON" == "¿Cómo evito que las personas llamen directamente a mi servicio web JSON?". Me di cuenta de que esta vez usted dio la razón, lo que significa que realmente podemos darle soluciones alternativas razonables, pero sigue siendo la misma pregunta. – Matchu

Respuesta

0

Hay una amplia gama de cosas que puede hacer para agregar seguridad a su servicio. Verifique esto out

0

No puede proteger adecuadamente un servicio web que se puede llamar desde javascript del lado del cliente.

Puede probar la seguridad mediante técnicas oscuras como la ofuscación de JavaScript, pero no detendrá a nadie motivado.

4

No hay una manera fácil de evitar que. Si su servicio no es extremadamente popular y, por lo tanto, es probable que sea blanco de ataques de denegación de servicio, no me molestaría.

Una cosa que me vino a la mente es el uso de tokens desechables (válido para 10 o 100 solicitudes).

Otro enfoque (ingenuo) es comprobar que existe el encabezado X-Requerido-A petición, pero, por supuesto, se puede falsificar fácilmente. Entonces, mi consejo es: no hacer nada a menos que el problema sea real.

Una idea más: hash calc. La idea es exigir que el cliente realice un cálculo bastante caro por cada solicitud, mientras que validar el cálculo en el lado del servidor es barato. Para una única solicitud, la sobrecarga es muy pequeña, pero digamos que para 1000 solicitudes puede tomar una cantidad significativa de tiempo de CPU. No tengo idea si hashcalc se ha utilizado para evitar los servicios web de DoS. Hace algunos años se propuso como medida antispam, pero nunca se hizo popular.

+0

¿Cómo funcionaría un token desechable y se generaría a partir de un archivo index.html? – Hank

+0

Bueno, el atacante podría volver a buscar index.html para obtener un nuevo token, por lo que tampoco es una contramedida muy eficiente, a menos que limite cuántos tokens se generan por minuto por cada IP, etc. – jholster

+0

Relacionado con HTTP_X_REQUESTED_WITH, no creo está disponible en todos los idiomas ... por ejemplo PHP – Hank

1

La respuesta es realmente simple, utilice la protección CSRF. http://en.wikipedia.org/wiki/Cross-site_request_forgery

Simplemente, cuando el usuario llega a su sitio (index.php), se puso en sesión: CSRF = (RANDOM_HASH)

Pedir solicitud JSON, example.com/json.php?hash=$_SESSION['CSRF']

Y en JSON.php comprueba si $_GET['hash'] coincide con $_SESSION['CSRF']

Tan simple como eso ... ¡Es una solución del lado del servidor!

+5

La idea es evitar que un atacante acceda directamente a los servicios. Tu enfoque no resolverá eso. El atacante accederá a index.html, obtendrá el token y luego realizará la llamada directamente al servicio para obtener la información que desee. –

+0

Supongo que esto sería un token de una sola vez. ¿Cómo puedo hacer esto sin necesitar index.php? ¿Puedo hacer esto solo con index.html? – Hank

+0

El sufijo de archivo no importa, pero CSRF requiere páginas "dinámicas", es decir, no se puede hacer con archivos estáticos. – jholster

1

Me gustaría hacer un seguimiento de las direcciones IP que realizan las solicitudes. Si alguna vez vio una gran cantidad de solicitudes provenientes de la misma IP, podría bloquearla u ofrecer un CAPTCHA.

Cuestiones relacionadas