Foros del Web » Programando para Internet » PHP »

[Aporte] Función selectiva de etiquetas HTML

Estas en el tema de [Aporte] Función selectiva de etiquetas HTML en el foro de PHP en Foros del Web. Hola a todos, llevo ya un añito con PHP y MYSQL, así que me encuentro en un proyecto de pagina para ver si entre practicas ...
  #1 (permalink)  
Antiguo 10/05/2012, 15:09
 
Fecha de Ingreso: octubre-2011
Mensajes: 4
Antigüedad: 12 años, 6 meses
Puntos: 1
[Aporte] Función selectiva de etiquetas HTML

Hola a todos, llevo ya un añito con PHP y MYSQL, así que me encuentro en un proyecto de pagina para ver si entre practicas y el proyecto aprendo más, mejor y además saco partido a lo aprendido.

Bueno estoy haciendo un formulario para la publicación de noticias en el que estoy teniendo en cuenta muchos temas de seguridad web, una de ellas vi que era la Inyección HTML y decidí filtrar las etiquetas sin perderlas. Hay muchas cosas que desconozco y otras que deseo aprender, así que todo lo que podáis recomendarme sera bienvenido y agradecido. :)

La siguiente función filtra el texto introducido y lee el contenido de las etiquetas encontradas, los "menor que" y "mayor que" sueltos, si la información del interior de las etiquetas encontrada es referente a las etiquetas permitidas (En mi caso "a href", "/a" y "img src") pues no las toca, pero si son de cualquier otra cosa, las cambiara por sus nombres HTML impidiendo el uso de etiquetas como <script> u otras.

Creo que podría ampliarlo todavía más, poniendo que la etiqueta "a href" si no encuentra </a> se cierre sola y esas cosas, pero por el momento me conformo con esto ya que su misión principal esta cumplida o eso creo, eso os lo dejo a vosotros para que lo juzguéis.

Código PHP:
function filtro_publicacion(&$valor){
    
    
$valor_array str_split($valor);
    
$o 0;
    
$tag_composition '';
    
$mayor_aux 0;
        foreach (
$valor_array as $valor_array_aux){
            if(
$valor_array_aux == "<"){ //Si existe < entonces buscara más adelante un >
                    
$tag[] = $o//Guarda la posicion de < en la primera iteracion
                    
$metating[] = $valor_array_aux;
            }
            if(
$valor_array_aux == ">"){
                    
$tag[] = $o//Guarda la posicion de > en la primera iteracion
                    
$metating[] = $valor_array_aux;
            }
            
$o++;
        }
        
            
$count_tag count($tag) - 1// Se hace un menos 1 al count para que no guarde un valor de más que no existe
                
for ($i 0$i <= $count_tag$i++){
                    if (
$metating[$i] == "<"){ //Obtiene posicion del tag <
                            
$ad $i;
                        if (
$metating[$ad] == ">"){ // Obtiene posicion del tag >
                            
$minor $tag[$i] + // Obtiene posicion del contenido interior desde <
                            
$minor_aux $i// Vuelve a su posicion en <
                            
$mayor $tag[$ad] - 1// Obtiene posicion del contenido interior desde >
                            
$mayor_aux $ad// Vuelve a su posicion en >
                                
while ($minor <= $mayor){ // Obtiene desde punto A a punto B toda la informacion del interior de las etiquetas
                                        
$tag_composition .= $valor_array[$minor];
                                    
$minor++;
                                }
                                
                                if (
strpos($tag_composition"img src") !== FALSE OR // Si se encuentra las palabras dentro de la etiqueta
                                    
strpos($tag_composition"a href") !== FALSE OR
                                    
strpos($tag_composition"/a") !== FALSE// Esto se puede ampliar con las palabras reservadas que se quieran
                                

                                    
// Primer caso si estan las palabras reservadas
                                
}else{                                        
                                    
// Segundo caso no se encuentran las palabras reservadas
                                    // Las etiquetas osea solo < > al no ser las palabras reservadas deseadas se cambian por su nombre de entidad de HTML en ASCII
                                    
if ($metating[$minor_aux] == "<"){
                                        
$position_valor_array $tag[$minor_aux];
                                        
$valor_array[$position_valor_array] = "&lt;";
                                    }
                                    if(
$metating[$mayor_aux] == ">"){
                                    
$position_valor_array $tag[$mayor_aux];
                                        
$valor_array[$position_valor_array] = "&gt;";
                                    }
                                }
                            
$tag_composition ''//Se vacia aqui la variable para que no mezcle la informacion a verificar y sea unica
                        
}else{
                            
//Cambia los solitarios <
                            
$position_valor_array $tag[$i];
                            
$valor_array[$position_valor_array] = "&lt;";
                        }
                    }
                    if (
$metating[$i] != "<"){
                        if (
$i == AND $tag[$i] == ">"){
                                
//Cambia el solitario > solo para el 0
                            
$position_valor_array $tag[$i];
                            
$valor_array[$position_valor_array] = "&gt;";
                        }
                        if (
$tag[$i] != $tag[$mayor_aux]){
                                    
// Evitar que pase por encima de los > ya verificados
                                    // Cambia los solitarios >
                                
$position_valor_array $tag[$i];
                                
$valor_array[$position_valor_array] = "&gt;";
                        }
                    }
                }
                
$valor implode($valor_array);
            return (
$valor);

Siento mucho si el código es algo ilegible o cuesta de leer, tengo aun mucho que mejorar en este aspecto creo yo.

Un saludo y gracias por vuestro tiempo, dejadme algún comentario si lo habéis probado, si os a gustado o que cambiaríais del código, me gustaría saber. ;)
  #2 (permalink)  
Antiguo 10/05/2012, 15:14
 
Fecha de Ingreso: diciembre-2010
Mensajes: 788
Antigüedad: 13 años, 4 meses
Puntos: 51
Respuesta: [Aporte] Función selectiva de etiquetas HTML

Te paso una funciona que uso a veces, puede estar desactualizada y faltar alguna que otra cosa, pero es mucho mas compacta y ademas tiene en cuenta los eventos onxxx.

Código PHP:
Ver original
  1. function cleanQuery($string)
  2. {
  3.   {
  4.     $string = stripslashes($string);
  5.   }
  6.   $string = preg_replace('/((\on(\w+).*?)\=)|(\"|\=|\%|\)|\(|\')/si', '', $string);
  7.   $string = strip_tags($string);
  8.   $string =mysql_real_escape_string($string);
  9.   $string = htmlspecialchars($string);
  10.  
  11.   return $string;
  12. }

Etiquetas: etiquetas, formulario, html, mysql, selectiva, variables
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 02:59.