2010-03-06 30 views
5

Aquí es una pieza de código del método de la clase xss_clean Input_Core del marco Kohana:¿Es necesaria la iteración en el siguiente fragmento de código?

do 
{ 
// Remove really unwanted tags 
$old_data = $data; 
$data = preg_replace('#</*(?:applet|b(?:ase|gsound|link)|embed|frame(?:set)?|i(?:frame|layer)|l(?:ayer|ink)|meta|object|s(?:cript|tyle)|title|xml)[^>]*+>#i', '', $data); 
} 
while ($old_data !== $data); 

¿El bucle do ... while necesario? Creo que la llamada preg_replace haría todo el trabajo en una sola iteración.

Respuesta

3

Bueno, es necesaria si la sustitución potencialmente crea nuevos partidos en la siguiente iteración. No es muy derrochador porque es solo y un control adicional en el peor, sin embargo.

Según el código que coincide, parece poco probable que cree nuevas coincidencias por reemplazo, sin embargo: es muy estricto con respecto a lo que coincide.

EDITAR: Para ser más específico, intenta hacer coincidir un corchete de ángulo de apertura seguido opcionalmente por una barra seguida de una de varias palabras clave seguidas opcionalmente por cualquier número de símbolos que no sean un corchete de ángulo de cierre y finalmente un corchete de ángulo de cierre . Si la entrada sigue esa sintaxis, será tragada entera. Si está mal formado (por ejemplo, múltiples corchetes angulares de apertura y cierre), generará basura hasta que ya no pueda encontrar subcadenas que coincidan con la secuencia inicial.

Entonces, no. A menos que tenga un código como <<iframe>iframe>, no es necesario repetirlo. Pero entonces está tratando con un nivel de sopa de etiquetas que la expresión regular no es lo suficientemente buena para todos modos (por ejemplo, fallará en el < iframe> con el espacio adicional).

EDIT2: También es un poco extraño que el patrón coincida con cero o más barras al principio de la etiqueta (debe ser cero o uno). Y si mis conocimientos expresión regular no es demasiado oxidado, la final *+ no tiene mucho sentido, ya sea (el asterisco significa cero o más, significa que el más uno o más, tal vez es una sintaxis codiciosos o algo de fantasía así?).

2

En un tema totalmente sin relación, me gustaría añadir una palabra en la optimización de aquí.

preg_replace() puede indicarle si se ha realizado o no un reemplazo (consulte el quinto argumento, que se pasa por referencia). Es mucho más eficiente que la comparación de cadenas, especialmente si son grandes.

Cuestiones relacionadas