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:
<?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)
)
);
?>
<!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:
if (get_magic_quotes_gpc())
$string = stripslashes($string);
return mysql_real_escape_string( $string, $this->dbh );
}
6 replies on “Quiz sobre validación de datos en PHP”
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
Buenas, aún no capto el problema de seguridad. ¿Podrías dar alguna indicación para encontrar el error?
Saludos, y desde ya gracias!
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
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".
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.Vale, vale... que ayer tenía un poco de sueño xD.
Gracias por el tiempo ;).
Saludos desde Chile.