Foros del Web » Programando para Internet » PHP »

revisar datos lado del servidor

Estas en el tema de revisar datos lado del servidor en el foro de PHP en Foros del Web. Hola. Estoy haciendo la parte del registro de usuario de mi pagina. Primero lo controlo con Javascript Basicamente hago esto (es solo un extracto del ...
  #1 (permalink)  
Antiguo 30/11/2010, 13:33
 
Fecha de Ingreso: enero-2010
Mensajes: 128
Antigüedad: 14 años, 9 meses
Puntos: 2
revisar datos lado del servidor

Hola.

Estoy haciendo la parte del registro de usuario de mi pagina.

Primero lo controlo con Javascript

Basicamente hago esto (es solo un extracto del javascript):

Código:
function validar_datos(){

//Defino variables para que se a mas comodo trabajar.
var nom=document.usuario.nom_us.value;
var ape=document.usuario.ape_us.value;

//Defino estas variables para hacer la comparacion en el ultimo If. 
//Flag en ingles es bandera.
var flagnom=false;
var flagape=false;

//este input informa que los password son diferentes, lo inicializo como vacio para que no quede un error anterior en pantalla.
document.getElementById("distinto_password").style.display="none";

//===========Evaluo el nombre ========================================
//32= Espacio
document.getElementById("nombre").style.display="none";
if (!nom.length==0){
	for(i=0;i<nom.length;i++){ 
		if((nom.charCodeAt(i)>=97 && nom.charCodeAt(i)<=122) || (nom.charCodeAt(i)>=65 && nom.charCodeAt(i)<=90) || 
		(nom.charCodeAt(i)==32)){  
			document.getElementById("nombre").style.display="none";
			flagnom=true;
		}else{
			document.getElementById("nombre").style.display="inline";
			flagnom=false;//si encuentra un codigo ASCCI fuera de los permitidos la cadena es invalida, por lo tanto deja de explorar la cadena mediante la instrccion: break;		
			break;	
		}			
	}
}else{
	flagnom=false;
	document.getElementById("nombre").style.display="inline";	
}

//===========Evaluo el apellido ========================================

document.getElementById("apellido").style.display="none";
if (!ape.length==0){
	for(i=0;i<ape.length;i++){ 
		if((ape.charCodeAt(i)>=97 && ape.charCodeAt(i)<=122) || (ape.charCodeAt(i)>=65 && ape.charCodeAt(i)<=90) || 
		(ape.charCodeAt(i)==32)){  
			document.getElementById("apellido").style.display="none";
			flagape=true;
		}else{
			document.getElementById("apellido").style.display="inline";
			flagape=false;//si encuentra un codigo ASCCI fuera de los permitidos la cadena es invalida, por lo tanto deja de explorar la cadena mediante la instrccion: break;		
			break;	
		}			
	}
}else{
	flagape=false;
	document.getElementById("apellido").style.display="inline";	
}

etc....
etc....
etc....

Luego en PHP (lo datos llegan por POST), antes de guardarlo en la BD hago básicamente lo mismo

Recorro todas la cadena ($_POST['xxxxxx']) cacaracter a caracter y me fijo mediante el codigo ASCII que el string solo tenga caracteres permitidos, mayusculas, minusculas, espacio, el punto y el guion bajo.

Solo si todo esta bien lo guardo en la BD.

¿Esta bien hacerlo asi?, basicamente es lo mismo en Javascript que en PHP, pero tengo entendido que del lado del servidor (php) es mas seguro.

Gracias.
  #2 (permalink)  
Antiguo 30/11/2010, 13:45
 
Fecha de Ingreso: noviembre-2009
Mensajes: 205
Antigüedad: 15 años
Puntos: 15
Respuesta: revisar datos lado del servidor

Claro que es más seguro, de hecho todo lo que puedas hacer del lado del cliente no es más que para mejorar la usabilidad y hacer más eficiente la interfaz. En cuanto a seguridad no te aporta absolutamente nada ya no puedes comprobar que tu código se va a ejecutar y sin sufrir alteraciones.

Con respecto a la lógica a aplicar en el servidor puedes chequear htmlentities() y mysql_real_escape_string(), sin dudas te serán de utilidad.
  #3 (permalink)  
Antiguo 01/12/2010, 07:45
 
Fecha de Ingreso: enero-2010
Mensajes: 128
Antigüedad: 14 años, 9 meses
Puntos: 2
Respuesta: revisar datos lado del servidor

Hola

estuve mirando la funcion htmlentities(), pero me parece que no me sirve mucho, en cambio hice esta funcion que evalua toda la cadena a traves del codigo ASCII, caracter a caracter.

Si la cadena evaluada tiene valores permitidos, MAYUSCULAS, minusculas, numeros, punto( . ) y guion bajo ( _ ), devuelve uno (TRUE), de lo contrario devuelve cero (FALSE), ademas compara la cadena contra un array(), de palabras reservadas, ent. sucede lo mismo, si encuentra una palabra reservada en la cadena a evaluar devuelve cero, sino 1

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 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;	
}
Yo creo que si se aplica esta funcion + mysql_real_escape_string() + md5, estaría bastante bien, aun por su puesto no se puede asegurar que sea 100% seguro.

Diganme que les parece.

Etiquetas: lado, revisar, servidores
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:36.