La mejor idea aquí es que, como se ha dicho, use tokens CSRF. La forma más sencilla es agregar la dirección IP de los usuarios como un identificador en una base de datos y luego agregar un valor aleatorio para esta IP. El valor aleatorio es el token correcto.
Por ejemplo, cuando alguien visita su página para obtener el formulario, tome la IP de los usuarios, digamos:
12.12.12.12.
Agregar a una base de datos clave-valor junto con un valor aleatorio:
12.12.12.12 = ljghsdlghdlghdlshsdflgd (nota, NO use el ejemplo "ljghsdlghdlghdlshsdflgd", en su lugar genere un valor pseudoaleatorio de una longitud suficiente)
Agregue este valor pseudoaleatorio como un campo oculto.
Al enviar, use la IP de los usuarios para buscar la respuesta sugerida. Si la respuesta real coincide con la respuesta sugerida, se acepta la solicitud.
En CUALQUIER intento de envío (independientemente del éxito o no), elimine el registro en la base de datos, si existe alguno. Esto significa que cualquier intento de CSRF invalidará los tokens reales para el usuario objetivo, y cada token será de un solo uso. Dependiendo de qué tipo de base de datos sea, es simple configurar la clave en "" o simplemente eliminarla.
Me gusta:
12.12.12.12="".
Una buena idea es también vencer estos valores por tiempo, tanto por seguridad como por deshacerse de datos innecesarios en la base de datos. Dependiendo de si es un foro, puede ser conveniente tener un par de horas como tiempo de validez, mientras que si es una forma simple de decirlo, cambiar una contraseña, entonces es suficiente con aproximadamente 5 minutos como tiempo de validez.
Otra idea es captcha, que también evita los ataques automáticos del lado del cliente, como infecciones de virus y troyanos de control remoto automatizados. Dependiendo de la sensibilidad de la aplicación web, puede ser una buena idea usar tokens Captcha AND CSRF al unísono. No siga el consejo de usar el mismo token para una sesión completa, es una mala idea en cuanto a seguridad, ya que existe una pequeña posibilidad de que el usuario pueda ser engañado para que envíe un token a un atacante también al sitio. Un token de un solo uso será inútil para el atacante, pero un token de uso múltiple puede ser tan peligroso como una sesión, cuyo CSRF está diseñado para proteger.
Por lo tanto, usar tokens de un solo uso, es la mejor seguridad en comparación con los tokens de uso múltiple, y también los tokens de un solo uso no necesitan estar protegidos en tránsito como lo sugiere el artículo de CSRF en una de las otras respuestas.