javascript - descargar - ¿Por qué los navegadores permiten a onmousedown JS cambiar href?
void(0) javascript href (3)
El consejo que muchos de nosotros le hemos dado a las personas menos conocedoras de la tecnología (ver a dónde lo lleva el enlace antes de hacer clic para que no sea víctima de phishing) ahora parece haberse vuelto inútil.
Si con "verificar" te refieres a que los navegadores de "vista previa" del enlace se muestran en la barra de estado inferior, entonces estás en lo correcto. Eso no es suficiente para verificar si un enlace realmente va donde dice estar yendo. Por ejemplo, ejecutar el script jquery a continuación en una página hará que todos los enlaces vayan a google.com independientemente de cuál sea el objetivo href real del enlace:
$(''a'').click(function(evt){evt.preventDefault();window.location.href="http://google.com"})
l.php
mucho tiempo he notado que cuando intentas copiar una ubicación de enlace o abrir un enlace en Facebook, modifica el enlace y lo pasa a través de l.php
.
Por ejemplo, puedo ser enviado a
http://www.facebook.com/l.php?u=http%3A%2F%2Fwww.google.com%2F&h=DKVUritNDJDJLDLVbldoDLFKBLOD5dlfDJY_-d3fgDUaA9b
aunque mi navegador muestra la vista previa del enlace como http://www.google.com/
.
Hoy, eché un vistazo más de cerca usando Firebug y encontré que Facebook pone onmousedown="UntrustedLink.bootstrap($(this)[...]
en la etiqueta <a>
. El segundo que hice clic derecho en el enlace, vi el atributo href
cambio en Firebug.
Esto me preocupa
El consejo que muchos de nosotros le hemos dado a las personas menos conocedoras de la tecnología (ver a dónde lo lleva el enlace antes de hacer clic para que no sea víctima de phishing) ahora parece haberse vuelto inútil. ¿No es esto un riesgo de seguridad? ¿No pueden los sitios web de phishing hacer un uso incorrecto de esto?
¿Por qué los navegadores no previenen este comportamiento al no permitir onmousedown
para cambiar el href
o al ejecutar el javascript antes de leer el atributo href
, para que me envíen a la ubicación que creía que iba a hacer, no al cambio mientras hacía clic en él? ?
Editar : Quiero enfatizar brevemente que lo que me molesta más que el riesgo de phishing es que los usuarios están siendo engañados y simplemente me parece mal que esto pueda suceder, ya sea por una fuente de confianza o no.
Estoy de acuerdo en que aquí hay potencial para el phishing. Esto fue reportado como un error en Firefox hace bastante tiempo, pero el problema es este:
<body onmousedown="document.getElementById(''changeMe'').href=''www.somewhereelse.com''">
<a id="changeMe" href="www.google.com">google</a>
</body>
Los eventos pasan a su padre, usted necesitaría detectar si un evento onmousedown iba a cambiar el href de un elemento hijo. ¿Suena razonable? De acuerdo, ¿qué tal esto?
<script>
function switcher() {
window.location = "www.somewhereelse.com";
return false;
}
</script>
<body onmousedown="switcher()">
<a href="www.google.com">google</a>
</body>
Por lo tanto, debemos buscar también window.location
en las funciones activadas por los eventos onmousedown. ¿Todavía suena razonable? ¿Qué tal si tengo el evento onmousedown? Elimine el enlace por completo, reemplácelo con un nuevo elemento y luego active el clic sobre eso. Puedo seguir dando ejemplos.
El punto es que Javascript se puede utilizar para dirigir erróneamente a las personas que usan la barra de estado; no debes confiar en él, solo puedes confiar en la URL.
Para cambiar esto, los navegadores necesitarían dar el valor href establecido en un enlace en el momento de la presidencia de clics sobre cualquier otro evento que pueda suceder, básicamente deshabilitar eventos de mouse en etiquetas de anclaje. Me atrevería a adivinar que probablemente no hagan esto, rompería demasiadas aplicaciones que ya existen.
Editar: Alternativamente, he visto a gente proponer diferentes métodos para detectar y advertir al usuario sobre un posible secuestro de enlace, pero aún no he visto ninguno implementado.
¿No pueden los sitios web de phishing hacer un uso incorrecto de esto?
En realidad, no, porque Facebook es donde se debe llamar a dicho javascript. En primer lugar, el usuario tiene que acceder a una fuente que no es de confianza para incrustar el javascript en la etiqueta.