Quiz de la semana sobre PHP

El siguiente código, aparte de mostrar lo mal que programo :), contiene algunos errores graves; en realidad, esta porción de código intenta reproducir un error observado en otra aplicación 😛 .

php:
<?php
/* Timer start */
$mtime = explode(' ', microtime() );
$timestart = $mtime[1] + $mtime[0];

include_once dirname(__FILE__) . '/db.php';

header( 'Content-type: text/html; charset=utf-8' );

if ( empty($_GET['category']) || !is_numeric($_GET['category']) ) {
        header( 'Location: error.html' );
}

$posts = $db->get_results("     
        SELECT  posts.id, posts.name, posts.content,
                    users.name as author
        FROM    posts, users
        WHERE   posts.userid = users.userid AND
                        posts.category_id = {$_GET['category']}
        LIMIT   10"
);

?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "DTD/xhtml1-transitional.dtd">
<html xml:lang="es">

<head>
        <title>Search results</title>
</head>

<body>

        <div id="content">
        <?php if ( $posts ) : ?>

        <h2><?php echo count($posts); ?> elementos encontrados.</h2>   
       
        <?php foreach ( $posts as $post ) : ?>
               
        <div class="post">                 
                <h4 class="post-meta">
                <a href="ver.php?id=<?php echo $post->id; ?>"><?php echo $post->name; ?></a> |
                <?php echo $post->autor; ?>
                </h4>
                       
                <div class="content">
                <?php echo $post->content; ?>
                </div>
                       
        </div>
               
        <?php endforeach; ?>

        <?php else : ?>
       
        <p>No se encontró ningún post en la categoría seleccionada.</p>
       
        <?php endif; ?> 
        </div>
       
        <div id="footer">
       
        <?php
       
        /* Timer stop */       
        $mtime = explode(' ', microtime());
        $timeend = $mtime[1] + $mtime[0];
        $timetotal = $timeend - $timestart;
        $time = number_format($timetotal, $precision);
       
        echo <<<STATS
<!--
Referer: {$_SERVER['HTTP_REFERER']}
User IP: {$_SERVER['REMOTE_ADDR']}
-->

Página generada en {$time} segundos
STATS;
        ?>
        </div>
</body>

</html>

8 Replies to “Quiz de la semana sobre PHP”

  1. puesss sin meterme mucho en el código..

    el referer se puede modificar, y "creo" que después del header() debería poner un exit.

    Un saludo 😉

  2. Hola todos disculpen por la pregunta en este tema soy un principiante en php queria saber para que sirve esto

    $post->id;

  3. Stan, gracias por el dato, no sabía lo de las URL absolutas.

    Kesar e Ignacio, ambos tienen razón, ya que por falta de un exit() luego de enviar la cabecera de redirección, el código podría ser vulnerable a SQL Injection. Por otro lado, el código puede sufrir ataques XSS, ya que como menciona Kesar, el valor del referer es modificable.

    Ricardo, el código al que haces referencia se usa para acceder a las propiedades o métodos de un objeto: $objeto->Metodo()

  4. Porque la ejecución de script no se detiene al enviar las cabeceras, no lo notas por ejemplo cuando haces uso de header("Location: blabla"), porque el navegador le dá mayor importancia a esta cabecera y hace la redirección, si haces uso de herramientas como netcat o fiddler, puedes ver el verdadero HTML resultante :D.

Comments are closed.