Continuando con la serie, pongo otro script para que se diviertan.
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
9 replies on “Ejercicio de la Semana: Visualización de perfiles”
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.
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
En efecto Agustí, la variable
id
no está correctamente validada.¿Existe algún otro problema?
Hola, como haces para imprimir PHP en el wordpress? Es un plugin? Como se llama?
El plugin se llama iG_Syntax_Hiliter, puedes descargarlo desde: http://blog.igeek.info/still-fresh/2006/02/25/code-for-fun/
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']))
me corto el comentario por la mitad :S
Gracias, funciona perfectamente 🙂
Si no quieres que corte el contenido, dale una lectura al cuadro que aparece arriba de este campo de texto 😀