Más sobre validación de datos en PHP
Por: alex | 30 Octubre 2006 | Ver comentarios |
Como había mencionado anteriormente, para desarrollar aplicaciones seguras, hay que conocer bien la herramienta o lenguaje con el que se trabaja. Espero que estos pequeños quiz intenten mostrar algunas de las fallas más comunes que cometen los que recién empiezan o ya desarrollan con PHP.
El código mostrado a continuación, ¿tiene alguna falla? ¿cuál?
<?php if ( empty( $_GET['user'] ) && empty( $_POST['user'] ) ) die( 'Bad parameter' ); elseif ( ! empty( $_GET['user'] ) && intval( $_GET['user'] ) < 0 ) die( 'Bad parameter' ); elseif ( ! empty( $_POST['user'] ) && intval( $_POST['user'] ) < 0 ) die( 'Bad parameter' ); $sql = 'SELECT id, name, email FROM users WHERE id = ' . mysql_real_escape_string($_REQUEST['user']); echo $sql; ?>
Como ya saben, el código mostrado sólo es referencial, pero vale comentar la forma correcta de implementar ese pedazo de código.


ImZyos!
31 de Octubre de 2006, 01:13:30 am
Sin observarlo mucho está muy mal indentado(aunque hay de gustos a gustos),demasiados if, y muchas validaciones que no son necesarias, los errores son muy genericos, permite inyeccion SQL, sería bueno sacar las variales con extract($_POST), y el get respectivamente
kesar
31 de Octubre de 2006, 03:26:09 am
Yo lo pondría así :]
if(isset($_REQUEST['user'] && is_numeric($_REQUEST['user']))
{
$sql = 'SELECT id, name, email
FROM users
WHERE id = ' . mysql_real_escape_string($_REQUEST['user']);
echo $sql;
}
else
die('lol');
alex
31 de Octubre de 2006, 08:00:11 am
ImZyos!, como comenté, el código solamente es referencial y hay muchos
ifpara confundir a la audiencia :-D.Si, el código es vulnerable a Sql Injection, pero como se “explotaría” eso?
farlopex
31 de Octubre de 2006, 10:50:41 am
¿Podría ser por …?
if ( ( ! empty( $_GET['user'] ) && intval( $_GET['user'] )
tiene un bonito OR, o || y posteriormente un $_REQUEST en el SQL, es decir, podriamos pasar un $_GET['user'] = 'string' y un $_POST['user'] = 4
Así pasamos la validación de este IF, lo que no se es exactamente como explotar el error
alex
31 de Octubre de 2006, 11:07:56 am
Vá más o menos por ahí, ahora he cambiado un poco el código para “complicar” un poco las cosas
swass
31 de Octubre de 2006, 01:03:45 pm
Hola!
No he pensado mucho que ataques hacer pero ya que mysql_real_escape_string($_REQUEST[’user’]) no esta encerrado entre comillas, podríamos crear sentencias del tipo
SELECT id, name, email
FROM users
WHERE id = 5 OR 1=1
En este script no haría mucho daño en este caso, pero accederíamos a todos los usuarios en vez de a uno en concreto.
La cantidad de controles de a los arrays superglobales $_POST y $_GET podria evitarse metiendo el valor de “user” en una cookie, ya que el array $_REQUEST contiene los valores de $_GET, $_POST y $_COOKIE
Seguro que se pueden hacer ataques mucho mas malignos, bueno espero que mas o menos este encaminado.
Saludos
ANA MILENA
22 de Febrero de 2007, 02:25:33 pm
por favor despcribir qn si en que consiste php
GUASA
17 de Diciembre de 2007, 02:59:11 pm
ESTO NO SIRVE
joao daniel
3 de Junio de 2008, 01:01:31 am
necesito saber como hago con este problema: estoy en php pero necesito que cuando presione la tecla backspace no se me regrese a la anterior pagina necesito validar eso como hago e intentado de todas las formas posibles
joao daniel
3 de Junio de 2008, 01:02:37 am
necesito saber como hago con este problema: estoy en php pero necesito que cuando presione la tecla backspace no se me regrese a la anterior pagina necesito validar eso como hago e intentado de todas las formas posibles
denme respuesta lo mas rapido posible
jenia
12 de Junio de 2008, 04:45:41 pm
<?php
$id_link = mysql_connect($hostname, $username, $password);
if (! $id_link) {
$message = “La base de datos de usuarios no esta disponible, intente más tarde”;
}
else {
$num_cliente = $arr_request[’num_clientes’];
$str_sql = “select cliente_nombres from clientespaf where num_clientes=’$num_clientes’”;
$result = mysql_db_query($dbname,$str_sql,$id_link);
$message = “”;
if (! $result) {
$message = “Número de cliente no existe”;
}
$number_of_rows = @mysql_num_rows($result);
if ($number_of_rows
cliente_nombres == “”) {
$forma = “index08.php”;
$message = “¡Número de cliente correcto!”;
$boton = “Continuar”;
}
else {
$forma = “pag03.php”;
$message = “Bienvenido “.$record->cliente_nombres;
$boton = “Ir a mi pagina”;
}
}
else {
$forma = “pag01.php”;
$boton = ”
alguien me puede explicar este codigoasi funciona
pero quiero que me identifique 3 campos si estab vacios que me mande a una pagina. no lo puedo hacer…
asi como esta identifica el numero de cliente y lo compara con el nombre si esta vacio entonces ve rl apagina 8 pero si encontro el campo lleno mandarlo a la pagina 3 asi es como funciona pero si deseo que entre por tercera ocacion que detecto un segundo campo lleno y me mande a una tercer pagina como le hago????
jenia
12 de Junio de 2008, 04:47:52 pm
num_clientes es la variable la cual cual yo voy a dejar entrar al sitio esos numeros es el uno campo que tengo como dato o lleno en los campos
cliente_ nombres es la variable para nombre