Hay medios de CSRF siempre HTML o JavaScript malicioso que se apunta en su sitio web se han incrustado en otra página HTML (o un mensaje de correo electrónico) que se ha ejecutado correctamente.
Un ejemplo es el siguiente, que se ha colocado en otra página web que pregunta inocentemente para su nombre y edad antes de proceder:
<form action="http://yoursite.com/transferfunds" method="post">
Your name: <input type="text"><br>
Your age: <input type="text"><br>
<input type="submit">
<input type="hidden" name="amount" value="1000">
<input type="hidden" name="toaccount" value="12345678">
</form>
Tenga en cuenta que los puntos de acción a su sitio web y que los insumos oculta contiene la necesitan Información de POST Este ejemplo intentará transferir un fondo de 1000 (en cualquier moneda) al número de cuenta 12345678. Si requiere un inicio de sesión en su formulario y también lo comprueba, entonces lo anterior solo se ejecutará con éxito si el usuario no conoce inició sesión recientemente en su sitio web, pero aún no se ha desconectado, o la sesión aún no ha caducado.
Para evitar que esto suceda, su mejor opción es agregar un token basado en solicitud al formulario y validarlo en el lado del servidor. Es decir. genere una cadena aleatoria larga, única e imposible de adivinar que almacene en la sesión e incruste como elemento <input type="hidden">
del formulario. Cuando se envía el formulario, compare el valor del token enviado con el que ya está en sesión (y elimine inmediatamente el que está en sesión). Para ir un paso más allá, haga uso de CAPTCHA.
En su caso particular, creo que en realidad estás más preocupaciones acerca de XSS, que es un opuesto de CSRF, pero que a su vez también puede ser una fuente para CSRF. Un ejemplo de XSS es cuando el usuario introduce lo siguiente en un campo de entrada que se va vuelvan a mostrarse más pronto o más tarde en el mismo sitio web:
<form name="delete" action="admin/deleteusers" method="post"></form>
<script>document.form.delete.submit();</script>
Siempre que -como ser el administrador- vistas a la página con el comentario con la forma (y el guión) (¡invisible!) dentro, se ejecutará con éxito.
La prevención de XSS es realmente bastante fácil. Solo HTML-escape cualquier entrada controlada por el usuario (es decir, URL de solicitud, encabezados de solicitud, parámetros de solicitud y cuerpo de solicitud) antes de mostrarlos en la página web.En PHP puede utilizar htmlspecialchars()
para esto y en Java/JSP JSTL fn:escapeXml()
. De esta manera en cada una de la <
se convertirá en <
y >
a >
lo que hará que cualquier HTML entraron/JS se mostrará literalmente tal cual y por lo tanto no puede ser ejecutado.
Gracias - muy útil :) (A pesar de que yo no había pedido específicamente, me encontré con la comparación de XSS muy útil :)) Si entiendo correctamente, entonces todavía podría querer usar CSRF en algo así como un formulario de contacto para ayudar en la prevención de spambot, ¿verdad? –
Un token basado en solicitud y/o un captcha es el mejor enfoque. No está claro cuál es su lenguaje de programación de aplicaciones web. Revisé tu historial de preguntas y creo que estás apuntando a Python. A continuación, puede encontrar http://captchas.net útil. El sitio contiene un ejemplo de Python. – BalusC
Gracias, excelentes respuestas :) Creo que sé más o menos cómo implementar esto en mi tecnología de elección (el framework Django). No estaba claro sobre la naturaleza del ataque en sí. –