Más sobre validación de datos en PHP

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:
<?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.

13 Replies to “Más sobre validación de datos en PHP”

  1. 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

  2. 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');

  3. ImZyos!, como comenté, el código solamente es referencial y hay muchos if para confundir a la audiencia :-D.

    Si, el código es vulnerable a Sql Injection, pero como se "explotaría" eso?

  4. ¿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 :-)

  5. 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

  6. 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

  7. 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

  8. <?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????

  9. 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

  10. tengo un problema para balidar me podrian ayudar profavor 🙂 nesesito balidar todos los campos el de id como es la yave primaria ya esta balidado pero no se como balidar lso demas para que no los inserte vacios en la base de datos aki el codigo

    Forma insertar

    Datos proximos a insertar

    <?php
    echo $_POST['id']."";
    echo $_POST['nombre']."";
    echo $_POST['apellidos']."";
    echo $_POST['direccion']."";
    echo $_POST['edad']."";
    echo "";
    require("config.php");
    $con = @mysql_connect($HOST,$USER,$PASSWOR);

    if ($con)
    {

    $BD= mysql_select_db("ips");
    if ($BD)
    {

    $query= "insert into usuarios values(
    ".$_POST['id'].",
    '".$_POST['nombre']."',
    '".$_POST['apellidos']."',
    '".$_POST['direccion']."',
    ".$_POST['edad']."
    )";
    echo $query;
    $consulta = mysql_query($query, $con);
    if ($consulta)
    {
    echo "Registro insertado";
    }
    else
    {
    echo " Error : ".mysql_errno()." Error: ".mysql_error();
    }
    }
    }

    ?>

    Regresar

Comments are closed.