Anuncia aquí

Ejercicio de la Semana: Visualización de perfiles

Continuando con la serie, pongo otro script para que se diviertan.

php:
<?php
include_once './config.php';

if ( empty($_REQUEST['id']) && empty($_REQUEST['nick']) ) {
    die('No user selected');
}

if ( isset($_REQUEST['nick']) ) {
    if ( preg_match('/^[a-z0-9]{3,20}$/i', $_REQUEST['nick']) ) {
        $where = "WHERE nick='" . $bcdb->escape($_REQUEST['nick']) . "'";
    }
    else {
        die('Invalid nick: ' . $_REQUEST['nick']);
    }   
}
elseif ( !preg_match('/\d+/i', $_REQUEST['id']) || ($id = $bcdb->escape($_REQUEST['id'])) < 0 ) {
    die('Invalid user id: ' . $id);
}
else {
    $where = "WHERE id='$id'";
}

if ( ! ($user = $bcdb->get_row("SELECT * FROM users $where")) ) {
    die("User does not exists");
}

header('Content-type: text/html; charset=utf-8');
?>
<html>
<head>
    <title>Profile: <?php echo $user->name; ?></title>
</head>

<body>

<dl>

    <dt>Nombre</dt>
    <dd><?php echo $user->name; ?></dd>

    <dt>Email</dt>
    <dd><?php echo $user->email; ?></dd>
   
    <dt>Página Web</dt>
    <dd><a href="<?php echo $user->url; ?>"><?php echo $user->url; ?></a></dd>
</dl>

</body>

</html>

¿Existe algún problema con el código mostrado? Si es así, ¿cuál o cuáles?

Nota: A sugerencia de Agustí, he puesto una página de prueba. Si desean ver el código fuente de los ficheros php, aumenten una s al nombre. Ej http://test.buayacorp.com/quiz/user.phps

Actualización: Cambios realizados

  • Comillas simples agregadas alrededor de la variable id

Esta entrada fue publicada en Quiz, Seguridad

9 Comentarios

  1. 1 Agustí (23 de enero de 2007, 10:45:26 pm) http://biruji.org

    Esta fàcil, mañana lo comento. Ei he conseguido:
    SQL/DB Error -- [The used SELECT statements have a different number of columns]
    Tb lo he conseguido passar, ahora que me falta descubrir un campo que no controlo de la tabla users.

  2. 2 Agustí (25 de enero de 2007, 03:41:56 am) http://biruji.org

    He dejado un día entero, para no fastidiar a los demas:
    el problema esta en que el filtro sobre id no es correcto, ya que solo validamos que tenga un numero y luego escapa los quotes, pero podemo hacer unions... podiamos probar el load_file :-)
    ejemplo:
    http://test.buayacorp.com/quiz/user.php?id=0%20union%20select%20id,email,url,name,0%20from%20users

  3. 3 alex (25 de enero de 2007, 07:26:36 am) http://www.buayacorp.com

    En efecto Agustí, la variable id no está correctamente validada.

    ¿Existe algún otro problema?

  4. 4 Yo (25 de enero de 2007, 09:03:41 am)

    Hola, como haces para imprimir PHP en el wordpress? Es un plugin? Como se llama?

  5. 5 alex (25 de enero de 2007, 09:24:10 am) http://www.buayacorp.com

    El plugin se llama iG_Syntax_Hiliter, puedes descargarlo desde: http://blog.igeek.info/still-fresh/2006/02/25/code-for-fun/

  6. 6 freddy (25 de enero de 2007, 09:30:45 am) http://blog.3wstudio.com.ar

    Yo lo modificaria de esta manera

    if ( isset($_REQUEST['nick']) ) {
    if ( preg_match('/^[a-z0-9]{3,20}$/i', $_REQUEST['nick']) ) {
    $where = "WHERE nick='" . $bcdb->escape($_REQUEST['nick']) . "'";
    }
    else {
    die('Invalid nick: ' . $_REQUEST['nick']);
    }
    }elseif(isset($_REQUEST['id'])){
    if ( !preg_match('/\d+/i', $_REQUEST['id']) || ($id = $bcdb->escape($_REQUEST['id']))

  7. 7 freddy (25 de enero de 2007, 09:32:44 am) http://blog.3wstudio.com.ar

    me corto el comentario por la mitad :S

  8. 8 Yo (25 de enero de 2007, 09:35:16 am)

    Gracias, funciona perfectamente :)

  9. 9 alex (25 de enero de 2007, 09:35:39 am) http://www.buayacorp.com

    Si no quieres que corte el contenido, dale una lectura al cuadro que aparece arriba de este campo de texto :D

Publicar un Comentario

Tu email nunca será publicado o compartido. Los campos requeridos están marcados con un *

*
*

Puedes usar estas etiquetas y atributos HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>