Ver Mensaje Individual
  #1 (permalink)  
Antiguo 01/12/2010, 11:37
Lechu_
 
Fecha de Ingreso: enero-2010
Mensajes: 128
Antigüedad: 14 años, 3 meses
Puntos: 2
escapar cadena

Hola

Estoy cerrando el tema de seguridad en mi pagina y tengo una consulta
Hice una funcion que me permite determinar que caracteres pude contener el formulario enviado por el usuario.
Primero lo controlo en javascript y despeus en php, hago basicamanete la misma consulta (pero del lado del servidor).

Código:
function revisar_string($texto, $reservadas=0){
/*=====
Esta funcion permite evaluar si en una cadena ($texto), se encuentra algun caracteres fuera de los permitidos. Los valores permitidos para esta funcion son: letras MAYUSCULAS, minusculas, numeros, 
el punto, el espacio y el guion bajo(_).
Ademas permite enviar un arreglo de palabras no permitidas (no tendria sentido enviar signos no permitidos, por lo expresado en el primer párrafo). Si este arreglo no se envia, ent por defecto se carga un arreglo con palabras como: like, inner y join.
Esta funcion devolverá un valor que puede ser Cero ó Uno. Si devuelve cero, ent encontró una palabra prohibida/reservada ó algun caracter no permitido.
Si devuelve 1 (uno), la cadena contiene solo caracteres validos/permitidos.
===*/

	//Si ésta funcion devuelve cero, ent encontró una palabra prohibida/reservada ó algun caracter no permitido, por eso la variable flag empieza valiendo Cero.
	$texto=strtolower($texto);
	$largo=strlen($texto);//el strlen() empieza a contar desde uno y no desde cero.
	$flag='0';//Inicializo la variable.
	for ($i=0; $i<=($largo-1); $i++){
		$caracter=substr($texto, $i, 1);//Empieza en CERO y no en uno.
		$num_caracter=ord($caracter);
		//Caracteres permitidos: 48 al 57 -> numeros; 97 al 122 -> MAYUSCULAS; 65 al 90 -> minusculas; 46 -> punto; 95 -> guion bajo
		if ((($num_caracter>=97) AND ($num_caracter<=122)) OR (($num_caracter>=65) AND ($num_caracter<=90)) OR ($num_caracter==32) OR ($num_caracter==46) OR ($num_caracter==95)){
			$flag='1';						
		}else{
			$flag='0';
			$i=($largo-1);
		}
	}
		
	if ($flag=='1'){
		//Solo tiene sentido seguir comparando se han introducido valores validos sino informo el flag (return $flag;)
		//Ahora evaluo las palabras reservadas, a continuacion el arreglo
		if ($reservadas=='0'){
			$reservadas=array(
				'like',
				'inner',
				'join',	
			);			
		}
		
		$total_reservadas=count($reservadas);//Cuento cuantos elementos tiene el array $reservadas. Arranca a contar desde uno y no desde cero, por eso en el for de la linea siguiente voy hasta ($total_reservadas-1)
		
		for ($i=0; $i<=($total_reservadas-1); $i++){
			//$evalua= strpos($reservada['$i'], $texto);//no se puede usar strpos porque si la primera aparicion es Cero se presenta un problema, ver la referencia del manual ejemplo #1, en su lugar utilizo stristr(), busca una cadena dentro de otra y no discrimina entre mayusculas y minusculas.
			$evalua=stristr($texto, $reservadas[$i]);//busca la palabra prohibida segun el arreglo.
			//echo $evalua. "->". 
			if ($evalua!=FALSE){//O sea, si lo encuentra (==TRUE) las palabras prohibidas en la cadena $texto
				$flag='0';
				visor("palabra reservada: ". $reservadas[$i]);//Recordar que el arreglo empieza en la pos Cero  $reservadas[0], $reservadas[1], $reservadas[2], etc, etc.....
				$i=($total_reservadas-1);
			}	
		}
	}
	return $flag;	
}

Ademas me parece conveniente aplicar mysq_real_escape_string(), pero la verdad en unas paginas web encuentro que recomiendan no usarlo y en otras que si.
"Comillas magicas" esta en desuso, ¿pero mysq_real_escape_string(), debo usarla o no?.

Gracias.