miércoles, 26 de octubre de 2011

DOS-Moodle


Después de una siesta me encontré con que llovía ya se jodió el día dije, encedí mi notebook y entre a una sitio web con "Aula Virtual". y me buse a curiosear...
y encontré lo siguiente.
 http://elchusa.com/moodle/message/refresh.php?id=1&name=elchusa.com&wait=1
El contador de espera, que recoge la variable “&wait=”, tiene una peculiar forma de ir aumentando su tasa de refresco, según aumenta a su vez los segundos a la espera.
 A su vez el campo “&name=”, rescata el nombre de usuario de la base de datos que contiene mensajes nuevos.
Me llamo la atención, como la variable "&wait=" va en aumento.
&wait=1, &wait=2, &wait=3, &wait=4, &wait=5, &wait=6, &wait=8, &wait=10, &wait=12, &wait=15, &wait=18, &wait=22, &wait=27, &wait=33...
"Tal parece que no sabe sumar mas 1 "
**************************************************************************
            if ($wait < 300) {                     // Until the wait is five minutes 
$wait = ceil(1.2 * (float)$wait);  // Exponential growth
**************************************************************************
Miremos esta línea.
**************************************************************************
 $wait = ceil(1.2 * (float)$wait);  // Exponential growth
**************************************************************************
 La función ceil en php, devuelve el siguiente valor entero mayor, redondeando el valor si es necesario, así que si el resultado es por ejemplo 1,2 aun siendo más lógico redondear al valor menor, se transformaría a ser un 2.
1
1*1,2 = 1,2 ->2
2*1,2 = 2,4 ->3
3*1,2 = 3,6 ->4
4*1,2 = 4,8 ->5
5*1,2 = 6 ->6
6*1,2 = 7,2 ->8
8*1,2 = 9,6 ->10
10*1,2 = 12 -> 12
12*1,2 = 14,4 ->15
15*1,2 = 18 -> 18
18*1,2 = 21,6 -> 22
22*1,2 =26,4 -> 27
27*1,2 = 32,4 -> 33
33...
Asta ahí todo va bién.
¿Pero que número es el único que multiplicado por 1,2 consiga un comportamiento anómalo?
0

0*1,2 = 0 -> 0 (Cada cero segundos repite su ejecución) Cero por cualquier número es igual a cero.

 El redondeo lleva a un número entero mayor que -1 y menor que 1, del cual no se puede esperar una tasa de refresco con incremento, así que las peticiones que este conlleva al servidor, se ahogan en continuos e infinitos GET.
 Seguro más de un administrador, se volvería loco al ver tantas peticiones desde su localhost, siendo estas invocadas por el archivo refresh.php
Por otro lado el Fix, sería agregarle un "if" Si el valor es menor a 1, que devuelva 1, de esta forma conseguiremos que el algoritmo creado por los desarrolladores del proyecto, no pudiese ser modificado a manos de terceros.
S4lud0s

0 comentarios:

Publicar un comentario

Ahora estamos en www.adminpc.org

Twitter Delicious Facebook Digg Stumbleupon Favorites More