java ee - tag - ¿Cómo se evita que un usuario publique datos varias veces en un sitio web?
tag title (7)
Dos soluciones del lado del servidor vienen a la mente:
- Crear "tokens" de uso por única vez en un campo de formulario oculto. Una vez que se utiliza un token, se elimina de cualquier base de datos o objeto de contexto de sesión en el que lo esté almacenando. La segunda vez, no se acepta.
- La información de caché recibida, y si se recibe un formulario idéntico dentro de un cierto período de tiempo (¿10 minutos? ¿Una hora? ¡Usted decide!) Se ignora.
Estoy trabajando en una aplicación web (J2EE) y me gustaría saber las opciones disponibles para manejar una doble publicación desde el navegador.
Las soluciones que he visto y usado en el pasado son todas del lado del cliente:
- Deshabilite el botón de enviar tan pronto como el usuario haga clic en él.
- Siga un patrón POST-Redirect-GET para evitar POST cuando el usuario hace clic en el botón Atrás.
- Maneje el evento onSubmit del formulario y realice un seguimiento del estado de envío con JavaScript.
Preferiría implementar una solución del lado del servidor si es posible. ¿Hay mejores enfoques que los que mencioné anteriormente, o son mejores las soluciones del lado del cliente?
Es difícil implementar una solución a prueba de idiotas (ya que siempre mejoran a los idiotas). No importa lo que hagas, el lado del cliente puede ser manipulado o funcionar incorrectamente.
Su solución debe ser del lado del servidor para ser confiable y segura. Dicho esto, un enfoque es revisar la solicitud y verificar el estado o los registros del sistema / base de datos para determinar si ya se procesó. Idealmente, el proceso en el lado del servidor debe ser idempotente si es posible , y tendrá que protegerse contra los envíos dupe si no puede ser.
Implemente un uniqueid para ir con la solicitud y registrarlo junto con la ejecución. Si la identificación ya estaba registrada, no volverás a hacer el trabajo. Esto es un poco como la solución alternativa: debe intentar y deshabilitar el botón o enlace al lado del cliente, así como usted mismo se lo sugirió.
Puede proporcionar un "boleto" como parte del formulario, un número aleatorio, y asegúrese de que no se acepte dos veces, en el lado del servidor.
Usaría una marca de tiempo y compararía los valores con el código del lado del servidor. Si dos marcas de tiempo están lo suficientemente cerca y tienen la misma dirección IP, ignore el segundo envío del formulario.
utilizamos un boleto de una sola vez sensible al tiempo. Es como una identificación de sesión de tipo. Pero está vinculado a la forma / página.
Desecha el ticket cuando el usuario envía la página, y solo procesa las páginas que vienen con un ticket válido. Puede, al mismo tiempo, reforzar la seguridad al adjuntar el ticket a un usuario, por lo que si envía un ticket que es enviado por un usuario que no es el usuario al que se envió el ticket, rechaza la solicitud.
Struts tiene algo como esto integrado si lo estás usando.
http://struts.apache.org/1.x/apidocs/org/apache/struts/util/TokenProcessor.html