2012-01-03 11 views
6

ya he visto alguna pregunta de aquí (stackoverflow) y THIS puesto, pero todavía tengo algunas preguntas ...Previniendo CSRF?

  1. Usando el valor oculto en el formulario de envío y comprobar que cuando mensaje llega al servidor.

    • El valor oculto puede ser fácilmente copiado y enviado exactamente como el real, "difícil de adivinar" (como md5) no ayudará. (¿verdad?)
  2. Estableciendo una cookie cuando llegue al formulario y envíe el valor de la cookie como un valor oculto.

    • Puede cambiar fácilmente el valor de una cookie o enviar una cookie personalizada exactamente como la real usando el mismo valor real oculto. (¿verdad?)
  3. Utilizando 'timeout', los valores POST no pueden alcanzar demasiado tarde.

    • Por lo tanto, si es lento, fallará cuando intente configurar todo con el valor oculto. Si eres rápido, va a funcionar. (¿Verdad?)

Quiero estar protegidos sobre CSRF ... pero ¿cómo es exactamente lo hago?

+1

StackOverflow utiliza el descuento: utilícelo cuando publique en lugar de HTML. – Oded

+0

@Oded, gracias. Veré cómo lo editas y conoces. – PedroGabriel

+0

Consulte http://stackoverflow.com/questions/14667189/simple-example-for-why-same-origin-policy-is-needed para obtener una pregunta más general sobre CSRF. –

Respuesta

6

La manera más fácil que he encontrado para evitar problemas CSRF es:

  1. En el lado del servidor, asignar un cookie al cliente con un aleatorio (inimaginable) token de

  2. Coloque un campo oculto la forma con que el valor de la cookie

  3. al presentar la forma, asegurar el valor del campo oculto es igual al valor de la cookie (en el lado del servidor de las cosas)

+0

Si envío una cookie "personalizada" (por ej .: usando cURL) y un valor exactamente igual al valor de la cookie (la cookie personalizada obtuvo "a" y el valor oculto recibió "a" también) va a funcionar (creo), envíe el formulario valores como el real. – PedroGabriel

+2

Eso funcionará, pero CSRF no debe evitar que las personas envíen formularios juntos, solo para evitar que las personas formen formularios de publicación como otros (es decir, alguien con un inicio de sesión en estado autorizado). Todo el propósito del token aleatorio es que el usuario B (un hacker) no conoce el token del usuario A y, por lo tanto, no puede forjar una solicitud como ellos. – Matthew

0

Si realiza los siguientes cambios entonces creo que estás a salvo

  • no hay actualizaciones de datos debe permitirse mediante GET (o mejor puesto, así) (ya que ambos pueden ser utilizados a través de formularios HTML)
  • deshabilitar CORS en su servidor (o al menos en los puntos finales que son críticos y/o hacer cambios en los datos)
  • permiten API solo de JSON (es decir. solo acepte la entrada a través de JSON en puntos finales críticos al menos)

Solo para agregar a lo anterior: No utilice modificaciones de método y no admita navegadores antiguos.

+0

Usted acaba de responder a una pregunta de 2012 y su respuesta ni siquiera está relacionada con CSRF ... – PedroGabriel

+0

por favor lea la pregunta "prevenir CSRF?" y eso es lo que respondí. – RTSid