2012-05-17 30 views
5

Quiero usar la publicación para actualizar una base de datos y no quiero que la gente lo haga manualmente, es decir, solo debería ser posible a través de AJAX en un cliente. ¿Hay algún truco criptográfico bien conocido para usar en este escenario?¿Cómo bloquear solicitudes HTTP externas? (asegurando llamadas AJAX)

Supongamos que estoy emitiendo una solicitud GET para insertar un nuevo usuario en mi base de datos al site.com/adduser/<userid>. Alguien podría sobrepoblar mi base de datos emitiendo solicitudes falsas.

+0

aclare su pregunta, por favor ... –

+4

[No debe usar GET para ningún otro propósito que no sea la recuperación de datos.] (Http://tools.ietf.org/html/rfc2616#section-9.1.1) – Gumbo

+0

Es simplemente es más fácil de usar OBTENER un ejemplo, probablemente usaría POST de todos modos. – Peteris

Respuesta

5

No hay forma de evitar solicitudes falsificadas en este caso, ya que el navegador del cliente ya tiene todo lo necesario para realizar la solicitud; es solo cuestión de depurar para que un usuario malintencionado descubra cómo hacer solicitudes arbitrarias a su back-end, y probablemente incluso usar su propio código para hacerlo más fácil. No necesita "trucos criptográficos", solo necesita ofuscación, y eso solo hará que la falsificación sea un poco incómoda, pero no imposible.

+0

Temía que este fuera el caso. Si alguien tiene algún truco de ofuscación para sugerir, soy todo oídos. – Peteris

0

Funciona como cualquier otra página web: autenticación de inicio de sesión, verifique la referencia.

+0

¿Podría aclarar? ? ¿Está diciendo que la aplicación del servidor sabrá quién está emitiendo la solicitud y que es posible que solo reconozca las solicitudes AJAX? – Peteris

+0

Ver: http://stackoverflow.com/questions/7127686/blocking-non-ajax-requests-to-php La autenticación de sesión depende de usted. Puede darle al cliente una clave que se devuelve con cada solicitud. –

+0

Realmente no puedo encontrar ninguna solución segura allí. Consideré enviar autenticación de cliente, pero luego el cliente puede olfatear los encabezados y reutilizar la clave por sí mismos. Debe haber una solución más robusta, porque todas las aplicaciones web necesitan esto. – Peteris

1

Prevent Direct Access To File Called By ajax Function parece responder a la pregunta.

Usted puede (entre otras soluciones, estoy seguro) ...

  • gestión de sesiones utilización (Iniciar sesión para crear una sesión);
  • envíe una clave única al cliente que debe devolverse antes de que caduque (no se puede volver a utilizar y no se puede almacenar para usarla más adelante);
  • y/o establezca encabezados como en la respuesta vinculada.

Pero cualquier cosa puede ser falsa si las personas se esfuerzan lo suficiente. El único sistema completamente seguro es uno al que nadie puede acceder en absoluto.

1

Este es el mismo problema que CSRF, y la solución es la misma: use un token en la solicitud AJAX que haya almacenado previamente en otro lugar (o puede regenerar, por ejemplo, encriptando los parámetros usando el ID de sessin como clave) Chriss Shiflett tiene algunas notas sensatas sobre esto, y hay un OWASP project para detectar CSRF con PHP

+1

Esto no es exactamente el mismo problema que CSRF. En CSRF, es un problema de identidad, pero me preocupa que el usuario mismo abuse de sus propias credenciales de inicio de sesión, su propio token de sesión y use su propia cuenta para poblar artificialmente la base de datos. – Peteris

+0

Dado que es imposible restringir el acceso al servidor solo a sus API ajax, es exactamente lo mismo que CSRF – symcbean

+0

No necesito restringir el acceso al servidor (aunque sería genial), estoy buscando un truco criptográfico que permitiría al servidor saber cuándo las cosas provienen de la aplicación y no falsificadas por el usuario que utiliza un token olido. – Peteris

0

La solución es agregar la línea en negrita a las solicitudes ajax. También debes buscar autenticación básica, este no será el único protector. Usted puede coger los ingresos con estos código de la página ajax

Ajax llamada

function callit() 
{ 
if(window.XMLHttpRequest){xmlhttp=new XMLHttpRequest();}else{xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");} 
xmlhttp.onreadystatechange=function(){if(xmlhttp.readyState==4&&xmlhttp.status==200){document.getElementById('alp').innerHTML=xmlhttp.responseText;}} 
xmlhttp.open("get", "call.asp", true); 
**xmlhttp.setRequestHeader("X-Requested-With","XMLHttpRequest");** 
xmlhttp.send(); 
} 

PHP/ASP página solicitada respuesta

ASP

If Request.ServerVariables("HTTP_X-Requested-With") = "XMLHttpRequest" Then 
'Do stuff 
Else 
'Kill it 
End If 

PHP

if(isset($_SERVER['HTTP_X_REQUESTED_WITH']) && ($_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest')) 
{ 
//Do stuff 
} else { 
//Kill it 
} 
+1

Gracias por el esfuerzo, pero eso es solo un control de encabezado como otros han mencionado. No es lo suficientemente seguro, ya que el usuario puede falsificar el encabezado. – Peteris

2

Realmente no necesito restringir el acceso al servidor (aunque sería genial), estoy buscando un truco criptográfico que permita al servidor saber cuándo las cosas provienen de la aplicación y no forjadas por el usuario usando una ficha olfateada

No puede hacer esto. Es casi uno de los problemas fundamentales con las aplicaciones cliente/servidor. He aquí por qué no funciona: supongamos que tiene una forma para que su aplicación cliente se autentique en el servidor, ya sea una contraseña secreta o algún otro método. La información que necesita la aplicación es necesariamente accesible para la aplicación (la contraseña está escondida en alguna parte, o lo que sea).Pero debido a que se ejecuta en la computadora del usuario, eso significa que también tienen acceso a esta información: todo lo que necesitan es mirar el origen, el binario o el tráfico de red entre su aplicación y el servidor, y eventualmente se darán cuenta el mecanismo por el cual su aplicación se autentica y la replica. Quizás incluso lo copien. Tal vez escriban un truco ingenioso para hacer que su aplicación haga el trabajo pesado (siempre puede enviar una entrada falsa del usuario a la aplicación). Pero no importa cómo, tienen toda la información necesaria, y no hay forma de evitar que la tengan, lo que tampoco evitaría que tu aplicación la tenga.

+1

Esta es la mejor explicación que he visto en las diversas preguntas duplicadas. Debería agregarlo a http://stackoverflow.com/questions/1756591/prevent-direct-access-to-file-called-by-ajax-function, que es el más viejo engañado de esta pregunta. – IMSoP

+0

Tienes razón, @IMSoP, hay mucha incompetencia en las respuestas de ese hilo. Adapté mi respuesta un poco, porque lo que realmente necesitaba el OP era apuntar en la dirección de autenticación. – Enno

1

Este es un problema relacionado con la autorización: solo las solicitudes autorizadas deben dar lugar a la creación de un nuevo usuario. Por lo tanto, al recibir dicha solicitud, su servidor debe verificar si es de un cliente autorizado para crear nuevos usuarios.

Ahora el problema principal es cómo decidir qué solicitud está autorizada. En la mayoría de los casos, esto se realiza mediante roles de usuario y/o algún sistema de emisión de tickets. Con las funciones de usuario, tendrá problemas adicionales para resolver, como identificación de usuario y autenticación de usuario. Pero si eso ya está resuelto, puede asignar fácilmente los usuarios a roles como Alice es un administrador y Bob es un usuario normal y solo los administradores están autorizados a crear nuevos usuarios.

3

Se puede lograr.
Siempre que represente una página que se supone que debe realizar dicha solicitud. Genere un token aleatorio y guárdelo en sesión (para el usuario autenticado) o en la base de datos (en caso de que esta solicitud esté permitida públicamente).
y en lugar de llamar site.com/adduser/<userid> llamada site.com/adduser/<userid>/<token>
siempre que reciba dicha solicitud si el token es válido o no (de la sesión o base de datos)
En señal caso es correcto, el proceso de la solicitud y eliminar símbolo usado de la sesión/db
En caso de que el token sea incorrecto, rechace la solicitud.

Cuestiones relacionadas