Autor
|
Tema: [Pregunta]: Evitar "bugear" botones de envío (Leído 3,502 veces)
|
Leguim
Desconectado
Mensajes: 720
|
Buenas tardes, Hace un tiempo había publicado un tema donde preguntaba sobre como podía evitar que un usuario haga varios clicks a un botón "submit" que registre a un usuario... si va algo lento el servidor el usuario por apurado o porque tenga poca paciencia va a hacer click como 10 veces haciendo así unos 10 registros.. los "registros" no necesariamente son solamente cuando se registra un usuario ya que en este caso no va a haber problema ya que dos usuarios con el mismo correo no se pueden registrar... A lo que voy es... ¿Como evito el "insistente" envío de un formulario? Esto lo había solucionado perfectamente con el uso de javascript, pero todos sabemos que Seguridad + javascript = Peligro Así que lo quiero hacer pero con PHP un lenguaje del lado del servidor... Lo que tengo es: Formulario: <form method="post" onsubmit="return CheckSubmit();"> <input type="text" name="texto"> <button type="submit" name="enviar">enviar</button> </form>
javascript var sending_post = false; // functions function CheckSubmit() { if(sending_post == false) { sending_post = true; // Acá se puede mostrar una ventana modal o un mensaje de "Cargando..." return true; } else { return false; } }
La idea es pasar eso pero a PHP? ¿Como lo harían?
|
|
|
En línea
|
|
|
|
@XSStringManolo
Hacker/Programador
Colaborador
 
Desconectado
Mensajes: 2.399
Turn off the red ligth
|
Lo único que puedes hacer es rechazar las peticiones. Por mucho que alteres la funcionalidad del botón o la interfaz pueden mandarte 1000 peticiones simultaneas.
En estes casos puedes discernir lo que es un accidente de un ataque. Si le quitas la funcionalidad al botón con javascript onclick="Enviar();this.onclick=null;" el usuario solo puede enviar una petición. En la respuesta puedes volver a activar el botón si quieres desde PHP. Si te envía más es obvio que está manipulando la funcionalidad de algun forma. Si es necesaria la sessión para esa funcionalidad se la cierras y o mandas al panel de login. Si se loggea más de X veces en menos de X tiempo, le suspendes la cuenta X tiempo.
Por ejemplo si se loggea 20 veces en 1 minuto, lo avisas o lo banneas 5 minutos o lo que sea. Si en menos de 24 horas lo repite múltiples veces le banneas la cuenta más tiempo.
Si quieres darles por culo, le pones verificación por número de teléfono en el registro de cuenta para que no registren una nueva cada vez que banneas.
|
|
|
En línea
|
Mi perfil de patrocinadores de GitHub está activo! Puedes patrocinarme para apoyar mi trabajo de código abierto 💖 
|
|
|
Leguim
Desconectado
Mensajes: 720
|
voy a ver igualmente creo que es un poco menos complicado que eso, igualmente voy a probar cualquier cosa les comento... Dejo el tema abierto para nuevas respuestas..
Por ahí me explique mal, pero es que el usuario puede darle click rapidisimo varias veces a un botón de envío y va a enviar x peticiones dependiendo la x cantidad de veces que se dio el click...
|
|
|
En línea
|
|
|
|
@XSStringManolo
Hacker/Programador
Colaborador
 
Desconectado
Mensajes: 2.399
Turn off the red ligth
|
Por eso. Cárgate el botón en el primer click. Tienes onsubmit, removeEventListener, preventDefault y muchos etc. Yo suelo hacer esto: <form><button type="button" onclick="getElementsByTagName('form')[0].submit();this.onclick=null;">Enviar</button></form>
Si por lo que sea se siguen colando clicks te hice esta: <form><button type="button" onclick="Enviar()">Enviar</button></form> var _boton = {}; function Enviar() { if(_boton.pulsado === undefined) { _boton.pulsado = 1; document.getElementsByTagName('form')[0].submit; } }
De todas formas se pueden craftear peticiones a mano.
|
|
« Última modificación: 26 Diciembre 2019, 07:12 am por @?0!,5^34 »
|
En línea
|
Mi perfil de patrocinadores de GitHub está activo! Puedes patrocinarme para apoyar mi trabajo de código abierto 💖 
|
|
|
AlbertoBSD
Programador y
Moderador Global
 
Desconectado
Mensajes: 3.703
🏴 Libertad!!!!!
|
voy a ver igualmente creo que es un poco menos complicado que eso, igualmente voy a probar cualquier cosa les comento... Dejo el tema abierto para nuevas respuestas..
Por ahí me explique mal, pero es que el usuario puede darle click rapidisimo varias veces a un botón de envío y va a enviar x peticiones dependiendo la x cantidad de veces que se dio el click...
Te complicas mucho muchísimo. Hace tiempo publicaste que tenias un sistema antiCSRF por que no utilizas tambien ese token para prevenir esto... En el PHP válidas que el token sea valido he inmediatamente lo inválidas, así si recibes mas veces el mismo token simplemente lo ignoras o mandas mensaje de error. Un vez que el PHP procese la petición le mandas de respuesta un token nuevo al Javascrip y que este lo actualize. Lo mismo esta con el sistema recaptcha de google, si válidas con google más de una vez el mismo token te va a tirar error. Saludos!
|
|
|
En línea
|
|
|
|
Leguim
Desconectado
Mensajes: 720
|
El metodo ya lo tengo, es el que pase arriba de todo (javascript) pero lo que preguntaba era como pasar eso a PHP... veo mejor crear una variable PHP "sending_post" booleana
|
|
|
En línea
|
|
|
|
engel lex
|
o en el js, al hacer click, simplemente colocas el boton como disabled y un estulo que diga "enviando" esto evita los multiples click de parte del usuario en navegador sin importar que tan rapido haga click... ojo igual necesitas proteccion del backend como te dijeron los otros usuarios
|
|
|
En línea
|
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.
|
|
|
Leguim
Desconectado
Mensajes: 720
|
o en el js, al hacer click, simplemente colocas el boton como disabled y un estulo que diga "enviando" esto evita los multiples click de parte del usuario en navegador sin importar que tan rapido haga click... ojo igual necesitas proteccion del backend como te dijeron los otros usuarios
jeje por eso la parte del cliente ya la tengo, pase el código arriba... nada más quería saber como pasar un código similar como el que tengo arriba pero usando PHP que capaz tenga que usar AJAX la verdad todavía nose...
|
|
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
parametros "x" y "y" en envio POST
Nivel Web
|
wizache
|
6
|
7,113
|
9 Agosto 2010, 04:13 am
por lord mick
|
|
|
Botones, botones y más botones: Facebook puede anunciar los "Leído", ....
Noticias
|
wolfbcn
|
0
|
2,342
|
20 Septiembre 2011, 13:24 pm
por wolfbcn
|
|
|
recursos visual basic, """"""proceso inmortal"""""
Análisis y Diseño de Malware
|
Dark4ngel
|
7
|
14,864
|
3 Noviembre 2011, 10:42 am
por Dark4ngel
|
|
|
Facebook presenta dos nuevos botones, "Lo Quiero" y "Coleccionar", con la ...
Noticias
|
wolfbcn
|
4
|
6,102
|
9 Octubre 2012, 18:53 pm
por m0rf
|
|
|
[SOLUCIONADO] Evento "IsClicked" o algo parecido para los botones?
.NET (C#, VB.NET, ASP)
|
Eleкtro
|
3
|
4,145
|
6 Enero 2013, 04:44 am
por kub0x
|
|