2012-09-13 28 views
7

El espacio en blanco en archivos PHP a veces es problemático, así que estoy tratando de encontrar archivos que cumplan con los criterios problemáticos comunes. Estoy tratando de encontrar todos los archivos recursivamente que tienen una o ambas condiciones:Buscar archivos PHP de inyección de espacio en blanco

1) No comienza con un carácter < o #.

y/o

2) no termina en un personaje >, a menos que termina en una llave de cierre que es seguido por cualquier cantidad de saltos de línea.

creo que la primera condición sería: $[^<#]

Creo que la segunda condición sería: [ [^>^] | [}\n*^]]

Sin embargo, cabe destacar que en mis expresiones regulares ingenuos $ y ^ represento el inicio y el final de la archivo, no de ninguna línea en el archivo. E incluso con aquellos, suponiendo que fueran correctos, ¿cómo los combinaría? ¿Al igual que?

[$[^<#]] | [[ [^>^] | [}\n*^]]] 

A continuación, ponerlos en grep:

grep -r [$[^<#]] | [[ [^>^] | [}\n*^]]] * 

Obviamente, esto no está funcionando (tm). ¿Puede alguien enseñarme cómo corregir los errores? Gracias.

Este es un buen archivo:

<?php 

?> 

Así es la siguiente:

<?php 
function someFunc(){ 
} 


‏ 

Y esto también es bueno:

#!/usr/bin/php -q 
<?php 
?> 

líder HTML está bien:

<html> 
<?php 
echo '</html>'; 
?> 

arrastra HTML está muy bien también:

<?php 
echo '<html>'; 
?> 
</html> 

Esto es malo (nueva línea de ataque):

‏ 
<?php 

?> 

Esto es demasiado malo (espacio inicial):

‏ <?php 

?> 

Esto es malo como bien (línea nueva posterior):

<?php 

?> 
‏ 
+0

Una de las formas más fáciles de evitar este problema es NO incluir un '?>' De cierre al final de los archivos. Este es un PHP válido, y está incluido en muchos estándares de codificación PHP, incluido el estándar de codificación PEAR. Terminar los archivos con '?>' Es buscar problemas. –

+0

Una idea que podría considerar: activar el búfer de salida, 'include()' el archivo y ver si el resultado que genera cuando lo incluye tiene espacio en blanco inicial/final. –

+0

Gracias Frank. Sin embargo, los archivos que terminan en '?>' Son archivos PHP válidos, no desencadenan el error y son muy comunes. No voy a discutir con otros desarrolladores sobre el tema y cambiar su estilo de codificación, solo quiero automatizar el proceso de búsqueda de archivos problemáticos para mí. – dotancohen

Respuesta

2

Lanzó una expresión muy rápido que creo que hace lo que quiere. Es bastante tarde aquí y por alguna razón estoy en stackoverflow. En cualquier caso, espero haber recibido tu pedido correctamente.

Pruebe esta expresión regular /\A(?:\s+.*>|[^<#].*>\s*|<.*>\s+)\Z/s. Explicado aquí: http://regex101.com/r/cT7eY5

Espero que esta ayuda.Si no te entendí de ninguna manera, aclara e intentaré ajustar la expresión.

+0

Gracias. Se necesita mucho trabajo, pero creo que me está llevando en la dirección correcta. ¡Es tarde también! – dotancohen

+0

Olvidé el 's'-flag que es necesario para que funcione esta expresión. Si no lo estaba usando antes, asegúrese de hacerlo ahora. –

+0

Gracias Lindrian. Volviendo a esto, no me parece que '\ A' coincida con el comienzo de un archivo en mi versión de grep (2.9 en una distribución derivada de Debian). ¿'\ A' realmente coincide con el comienzo de un archivo en su sistema? ¿Qué sistema? Gracias. – dotancohen

Cuestiones relacionadas