Quiz de la semana sobre PHP
Por: alex | 13 Noviembre 2006 | Ver comentarios |
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
/* 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>


Stankiewicz
14 de Noviembre de 2006, 10:53:45 pm
Mmm, estoy verde en estas cosas de los errores, pero el header
Location:debe de llevar una ruta absoluta, aunque así también funciona.kesar
15 de Noviembre de 2006, 05:15:46 am
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
IgnacioMarcos
15 de Noviembre de 2006, 06:34:03 am
mmm yo me inclinaría más por el lado de sql injection.
Ricardo
15 de Noviembre de 2006, 10:17:37 am
Hola todos disculpen por la pregunta en este tema soy un principiante en php queria saber para que sirve esto
$post->id;
alex
15 de Noviembre de 2006, 02:04:16 pm
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()Victor
29 de Noviembre de 2006, 02:21:27 pm
Alex, tengo una duda, haber si sabes ¿Por que es necesario detener el script despues de una redirección mediante headers?…
:-S
alex
29 de Noviembre de 2006, 02:29:49 pm
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.Victor
29 de Noviembre de 2006, 02:30:39 pm
Hmm, he encontrado la respueta a mi pregunta… olviden todos mi off topic!