ForoFyL / forofyl.com.ar

ForoFyL's public website.
http://www.forofyl.com.ar
5 stars 3 forks source link

[bbCodes] Expresiones regulares no validan ciertas cadenas de texto correctas #3

Closed andrezrv closed 10 years ago

andrezrv commented 10 years ago

Este problema se identificó al querer usar el bbCode yt de la siguiente manera:

[yt]jv6HlyDw6UA‎[/yt]

El bbCode chequea que el parámetro ingresado sea del tipo SIMPLETEXT. Otros tipos recomendados por phpBB para este tipo de bbCodes son IDENTIFIER e INTTEXT, pero ninguno valida correctamente. Con el tipo TEXT se genera el output esperado, pero eso abre un problema de seguridad, ya que permite insertar código HTML dentro del bbCode.

Lo que supuestamente evalúa cada una de los tipos mencionados es lo siguiente:

SIMPLETEXT  Caracteres del alfabeto latino (A-Z), números, espacios, comas, puntos, menos, más, guión y guión bajo
INTTEXT Letras de caracteres Unicode, números, espacios, comas, puntos, menos, más, guión, guión bajo y espacios en blanco.
IDENTIFIER  Carecteres del alfabeto latino (A-Z), números, guión y guión bajo.

Cualquiera de los tres debería servir para ese bbCode, pero ninguno funciona con el caso mencionado.

Modo de uso del bbCode:

[yt]{SIMPLETEXT}[/yt]

Reemplazo HTML:

<div style="text-align:center">
    <object type="application/x-shockwave-flash" style="width:425px; height:350px" data="http://www.youtube.com/v/{SIMPLETEXT}">
        <param name="movie" value="http://www.youtube.com/v/{SIMPLETEXT}" />
    </object>
</div>
Canta commented 10 years ago

Ojo: http://www.forofyl.com.ar/viewtopic.php?p=2348706#p2348706

La regex en cuestión está "bien".

([a-zA-Z0-9-+.,_ ]+)

La saqué de la base de datos, la tabla "phpbb_bbcodes".

Puede estar fallando por cuestiones que exceden a la regex (dado que, a nivel definición, autónoma, debería funcionar), pero también puede no tener qué ver con la regex.

Ahí arriba linkié un ejemplo de un comportamiento muy extraño. Dejo los pasos a seguir para reproducirlo:

1) Crear nueva respuesta. 2) Copiar y pegar el código del video en la nueva respuesta, ya sea con o sin el bbtag yt. (en caso de no copiarlo, agregarlo después). 3) Confirmar que no funciona con vista previa. 4) Cambiar la última letra ("A") por su minúscula ("a"). 5) Vista previa de nuevo. Debería cargar el player, más no ningún video, dado que el código es case sensitive. 6) Volver a cambiar la última letra, esta vez de "a" hacia "A". 7) "Vista previa" o "Publicar", ahora el código que antes no funcionaba responde bien.

Alternativamente se puede probar poner en un solo post el código original y el modificado (dos bbtags "yt" distintos), y confirmar que en la vista previa (no recuedo si al primer intento o al segundo) que se muestran los dos players.

La regex por sí misma no debería tener ese comportamiento (salvo algún bug del motor, supongo). Tiene que haber alguna capa lógica más involucrada. O actividad paranormal... no sé qué puede ser esto, es muy raro.

andrezrv commented 10 years ago

Bueno, finalmente terminó siendo una cuestión de caracteres invisibles en el medio del string: http://www.forofyl.com.ar/viewtopic.php?p=2348726#p2348726.

¿Cómo ven las posibilidad de remover los caracteres no imprimibles antes de evaluar el string? Supongo que habría que ver si eso no rompe algo después. Acá tiran varias opciones para hacerlo: http://stackoverflow.com/questions/1176904/php-how-to-remove-all-non-printable-characters-in-a-string

Cambié el tag a question, porque ya no es un bug ni sabemos si va a ser un enhacement.

Canta commented 10 years ago

Como que honestamente me preocupan más las pirañas... y además filtrar caracteres es un tema re propenso a problemas: de repente estás filtrando bytes válidos para algún contexto, tenés que empezar a meter IFs para distinguir el contexto...

Por otro lado, ví que phpbb tiene funciones tipo "request_vars", que encapsulan el acceso a los datos que se le pasen al server, y poner una regex o algún otro filtro ahí adentro debería ser trabajo liviano.

Ahora, si tenemos que ir por el sistema buscando llamados a $_GET, $_POST, y $_REQUEST, para filtrar caracteres, la verdad que es una paja total.

¿Vos ves algún contexto donde eso de los caracteres mochos se vaya a complicar? Para mí que no pasa de regexes que fallan en bbcodes y sólo muy de vez en cuando.

A mí lo único que me sigue molestando de este tema es no saber cómo se generó. Es decir, cómo hizo alguien para meter esos chars ahí. Aún si hicieran cosas como cambiar el encoding en el browser a mano o cosas de esas, no debería suceder: era una letra "A" y un corchete, no algo problemático como podría ser una "á" por ejemplo, o cosas extrañas tipo "ǘ". Y el código lo copian de una URL en un browser, no de un editor binario. Es muy extraño.

andrezrv commented 10 years ago

Claro, ni da para ponerse a filtrar TODOS los inputs, de eso debería ocuparse la aplicación. Si no lo hace, bueno, habrá que tapar baches en lugares específicos, porque si lo hacemos en todos lados probablemente hagamos más mal que bien. O no, pero a lo mejor laburamos un montón para nada. En respuesta a tu pregunta, el único lugar donde se me ocurre que puede haber quilombos es en los bbCodes, y si filtramos lo haría solamente ahí.

Y sí, es raro que se haya metido ese caracter ahí. Justamente habría que ver de dónde se copió ese código, o dónde lo escribieron. A mí la intuición también me dice que lo sacaron de una URL, pero no sé si podemos estar TAN seguros de eso. Ponele que también pueden haberlo sacado de un link que dejó alguien en algún lado, y andá a saber si eso estaba parseado de alguna manera especial. La forma en que la gente usa sus computadoras a veces sigue siendo todo un enigma para mí.

Canta commented 10 years ago

Hmmm... no sé... Reemplazar sólo en la parte de bbcodes suena 10 puntos. Pero ahí veo a estos chabones en Stack Overflow sacándose los pelos con utf-8... y nosotros hablamos español...

Te diría, dejala picando; si no se vuelve algo serio o de todos los días, que se quede así. Total, tenemos acá la data anotada. Yo temo romper más de lo que arreglamos con esos replaces.

Por otro lado, si te parece que mejor le ponemos pilas a esto, dejámelo a mí así me voy poniendo canchero con phpbb. Esto debería ser ubicar una función genérica y poner un replace ahí adentro.

andrezrv commented 10 years ago

Y... como quieras. Para mí no vale la pena arreglar esto, seguro que van a surgir montones de cosas más importantes. Si vuelve a aparecer el problema, ya sabemos por qué es y qué decirle a la gente para que lo haga andar. Pero si tenés ganas de revisarlo, dale para adelante. Solamente avisame si lo agarrás o lo dejás de lado, así lo tagueo como haga falta y vemos si hay que hacerle seguimiento o no.

Canta commented 10 years ago

Nah... dejémoslo así entonces. Le daremos pelota cuando siga sucediendo. Para mí que esto pasa una vez por año con toda la furia.

andrezrv commented 10 years ago

Listo. Cerrado y wontfix, entonces.