Entradas

Mostrando las entradas etiquetadas como #Programming

JS: Triángulo de Pascal

Hoy, un pequeño problema de código Javascript. El siguiente snippet pretende crear un triángulo de Pascal . Al constructor Triangle se le pasa el número de filas que se quiere generar para la solución. La función fillRows() llama a fillRow(numRow) una vez por cada fila que se quiere generar. La función fillRow(numRow) se encarga de poner los números que van en cada posición de cada fila. Para ello usa un Array llamado row donde pone auxiliarmente los valores antes de agregarlos a this.rows . Estarán de acuerdo conmigo si les digo que el console.log() comentado como log "B" debería devolver lo mismo que el de la línea 5 -log "A"-. Pero no. Los resultados de cada console.log para new Triangle(2).rows son: Log "B": [[1], [1, 1]]. Log "A": [[1], undefined]. Es decir, this.rows tiene los valores correctos dentro de la función fillRow(numRow) pero no fuera de ella. ¿Cuál es el problema?¿Es una cuestión de scopes?¿Debería cambiar la...

Legacy Trash (IV)

Hola! Después de ver comprobar que: Ninguna entrada del usuario está validada, el sitio entero es el paraíso del XSS. No hay un solo archivo HTML en la ruta de la aplicación, absolutamente todo el código HTML se genera desde PHP.  Uno comienza a pensar que a esas alturas ya descubrió todas las falencias de la aplicación. Sin embargo, me topé con una función llamada enTiempo($tiempo) , que recibe un timestamp y lo devuelve en tiempo (?) es decir año, mes, día, horas, minutos y segundos ¿Se entiende, no? No hace falta que tenga un nombre mejor </sarcasm>. El problema de esto es que no tiene en cuenta jamás las zonas horarias ni ningúna sutil comodidad de las que suelen incluir las librerías de manejo de fechas o, en el último de los casos, la API estándar de PHP . La función en sí es la sgte.: function enTiempo($tiempo) { $tiempo=(int)($tiempo); if ($tiempo<=0) { return "0 hs"; } else { if ($tiempo/(60*60*24*365)>1) { return ((int)($tiempo/(60...

Legacy Trash (III) (Manejo de archivos subidos)

Buenas! Hoy seré breve. ¡Encontré otra función para quitar acentos! Llamada quitarAcentosb($str) . Supongo que la "b" final es de "Bien" ya que esta no hace manipulaciones extrañas a los strings. Sin embargo, no todo es diversión. La aplicación permite que un usuario suba imágenes. Si queremos ver el vaso medio lleno podemos decir que se verifica que el tipo de archivo sea una imagen. Y dejarlo ahí. Pero si nos ponemos más rigurosos, lo que en realidad se verifica, es que el tipo de archivo haya sido nombrado como imagen if (($ext[count($ext)-1]!=='jpg')&&($ext[count($ext)-1]!=='gif')&&($ext[count($ext)-1]!=='png')&&($ext[count($ext)-1]!=='jpeg')) Imagino que existen innumerables sitios que tengan esta misma lógica detrás y eso da un poco de miedo. Si por esas vueltas de la vida, el que escribió esta aplicación encuentra el blog estaría bueno que sepa que la extensión de un archivo NO indica el tipo de...

Legacy Trash (II)

Segunda entrega de este paseo por una aplicación PHP sangrienta. Después de pasar los ojos sobre un montón de líneas de código cuya complejidad solo es justificable en caso de que el programador estuviera realmente preocupado por su estabilidad laboral y después de encontrar: -Una simpática variable llamada $cúmulo. -Un script cuyo título era el nombre y apellido del autor. -Un comentario /***SEGUIMOS***/ , que me tranquilizó porque pensé que ya no estábamos siguiendo... Encontré un par de cosas más interesantes. Dialecto simplificado function quitarAcentos($cad) { //40 lineas de código que no quiero discutir $arr['z']='s'; $arr['ce']='se'; $arr['ci']='si'; $arr['ge']='je'; $arr['gi']='ji'; $arr['v']='b'; $arr['ll']='y'; $arr[' h']=' '; $arr['x']=''; foreach ($arr as $i => $v) { $cad=str_replace($i,$v,$cad); } } ¿Vieron eso? a...

Legacy Trash (I)

How'd y'all! Me cayó un proyecto legacy en PHP para que estime el tiempo que me llevaría agregar un par de funcionalidades nuevas a la codebase actualmente en producción. Tl;dr: demasiado tiempo. El código tiene tanta deuda técnica que adecentarlo no será negocio para nadie. Creo que lo único productivo que se puede hacer con el código es analizarlo para encontrar malas prácticas y pensar en porque uno debe evitarlas. Esta es la primera entrada de una serie de entradas que tiene ese fin: desenmascarar malas prácticas tratando de mantenernos lo más calmos posibles para ver que podemos aprender. Ojalá ese aprendizaje no solo sea respecto a lo que hace enojar a un dev que toma un proyecto legacy sino que nos haga reflexionar un poquito. Acción oculta if ($accion=='oculta') {    shell_exec("rm -r /var/www/html/A/B/");    mkdir("../B/"); } ¿Vieron eso? Un operador de comparación no-estricta (==) para comparar strings. Si $accion valiera 0 la co...