Quiz sobre validación de datos en PHP
Por: alex | 25 Septiembre 2006 | Ver comentarios |
El código mostrado a continuación, es una versión reducida de una falla de seguridad presente en una aplicación algo conocida.
Indiquen la falla, lo que se puede hacer con ésta, una forma de explotarlo y la solución que plantean al mismo:
// demo.php
<?php
include './db.php';
error_reporting(0);
$tb_url = $_POST['url'];
$title = $_POST['title'];
$excerpt = $_POST['excerpt'];
if (empty($title) || empty($tb_url) || empty($excerpt)) {
die ('Invalid values');
}
$title = htmlspecialchars( strip_tags( $title ) );
$title = (strlen($title) > 150) ? substr($title, 0, 150) . '...' : $title;
$excerpt = strip_tags($excerpt);
$excerpt = (strlen($excerpt) > 200) ? substr($excerpt, 0, 200) . '...' : $excerpt;
$contents=@file_get_contents($tb_url);
if(!$contents) {
die('The provided URL does not seem to work.');
}
$query = "INSERT INTO tabla (url, title, excerpt) VALUES ('%s', '%s', '%s')";
$db->query
(
sprintf (
$query,
$db->escape($tb_url),
$db->escape($title),
$db->escape($excerpt)
)
);
?>// show.php
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Bug</title>
</head>
<body>
<ul>
<?php
include './db.php';
$items = $db->get_results('SELECT url, title, excerpt FROM tabla');
foreach ($items as $tb) :
echo '<li><a href="'.$tb->url.'" title="'.$tb->excerpt.'">'.$tb->title.'</a></li>';
endforeach;
?>
</ul>
</body>
</html>Para el acceso a datos se usa la clase ez_sql, el método escape en mi versión, contiene lo siguiente:
function escape($string) {
if (get_magic_quotes_gpc())
$string = stripslashes($string);
return mysql_real_escape_string( $string, $this->dbh );
}


anabel
24 de Octubre de 2006, 09:59:18 am
hola alguien me podria decir como le hago para que exporte variables de una pagina php a html mi situacion esta asi:
en una pag. php despliego un reporte de una base de datos oracle pero en el query no puedo hacer los ajustes que necesito asi que me piden que construya una pagina html y ahi haga manualmente los ajustes que necesito y no se como hacer
ojala me puedan ayudar
diegocaro
26 de Junio de 2007, 11:10:11 pm
Buenas, aún no capto el problema de seguridad. ¿Podrías dar alguna indicación para encontrar el error?
Saludos, y desde ya gracias!
alex
26 de Junio de 2007, 11:30:24 pm
Ese código es vulnerable a dos problemas de XSS: la explicación para el primero puedes verlo en [1], el segundo problema es específico para Internet Explorer, tiene que ver con un bug en el manejo de codificaciones multibyte [2]
Saludos
[1] http://www.buayacorp.com/archivos/importancia-de-la-validacion-de-datos/
[2] http://forums.devnetwork.net/viewtopic.php?p=372842#372842
diegocaro
26 de Junio de 2007, 11:43:59 pm
Pero cuando haces $db->escape($tb_url), se deberían escapar los ” , ‘, etc… que se introduzcan en la url, digamos, no podrías ver la url con el XSS incluido “correctamente”.
alex
26 de Junio de 2007, 11:53:28 pm
Ten en cuenta que
$db->escape($tb_url)no sirve para evitar ataques XSS, sólo se usa para hacer consultas más seguras a la base de datos.diegocaro
27 de Junio de 2007, 11:20:54 pm
Vale, vale… que ayer tenía un poco de sueño xD.
Gracias por el tiempo ;).
Saludos desde Chile.