Foro de elhacker.net

Programación => Desarrollo Web => Mensaje iniciado por: Leguim en 25 Diciembre 2019, 22:58 pm



Título: [Pregunta]: Evitar "bugear" botones de envío
Publicado por: Leguim en 25 Diciembre 2019, 22:58 pm
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:
Código
  1. <form method="post" onsubmit="return CheckSubmit();">
  2.        <input type="text" name="texto">
  3.        <button type="submit" name="enviar">enviar</button>
  4. </form>
  5.  

javascript
Código
  1. var sending_post = false;
  2.  
  3. // functions
  4. function CheckSubmit()
  5. {
  6. if(sending_post == false)
  7. {
  8. sending_post = true;
  9. // Acá se puede mostrar una ventana modal o un mensaje de "Cargando..."
  10.  
  11.         return true;
  12. }
  13. else
  14. {
  15.                 return false;
  16. }
  17. }
  18.  

La idea es pasar eso pero a PHP? ¿Como lo harían?


Título: Re: [Pregunta]: Evitar "bugear" botones de envío
Publicado por: @XSStringManolo en 26 Diciembre 2019, 03:12 am
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.


Título: Re: [Pregunta]: Evitar "bugear" botones de envío
Publicado por: Leguim en 26 Diciembre 2019, 03:59 am
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...


Título: Re: [Pregunta]: Evitar "bugear" botones de envío
Publicado por: @XSStringManolo en 26 Diciembre 2019, 07:10 am
Por eso. Cárgate el botón en el primer click.

Tienes onsubmit, removeEventListener, preventDefault y muchos etc.

Yo suelo hacer esto:
Código
  1. <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:
Código
  1. <form><button type="button" onclick="Enviar()">Enviar</button></form>
  2.  
  3. var _boton = {};
  4. function Enviar()
  5. {
  6.   if(_boton.pulsado === undefined)
  7.   {
  8.   _boton.pulsado = 1;   document.getElementsByTagName('form')[0].submit;
  9.   }
  10. }

De todas formas se pueden craftear peticiones a mano.


Título: Re: [Pregunta]: Evitar "bugear" botones de envío
Publicado por: AlbertoBSD en 26 Diciembre 2019, 08:22 am
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!


Título: Re: [Pregunta]: Evitar "bugear" botones de envío
Publicado por: Leguim en 26 Diciembre 2019, 17:42 pm
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


Título: Re: [Pregunta]: Evitar "bugear" botones de envío
Publicado por: engel lex en 26 Diciembre 2019, 17:46 pm
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


Título: Re: [Pregunta]: Evitar "bugear" botones de envío
Publicado por: Leguim en 27 Diciembre 2019, 17:22 pm
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...