Aparentemente, debido a las estafas recientes, las herramientas de desarrollo son explotadas por personas para publicar spam e incluso se utilizan para "hackear" cuentas. Facebook ha bloqueado las herramientas de desarrollador, y ni siquiera puedo usar la consola.
¿Cómo hicieron eso? Una publicación de Stack Overflow afirmó que no es posible , pero Facebook ha demostrado que están equivocados.
Simplemente vaya a Facebook y abra las herramientas de desarrollador, escriba un personaje en la consola y aparecerá esta advertencia. No importa lo que pones, no se ejecutará.
¿Cómo es esto posible?
Incluso bloquearon el autocompletado en la consola:
javascript
facebook
google-chrome-devtools
Derek 朕 會 功夫
fuente
fuente
Respuestas:
Soy ingeniero de seguridad en Facebook y esto es mi culpa. Estamos probando esto para que algunos usuarios vean si puede ralentizar algunos ataques en los que se engaña a los usuarios para que peguen código JavaScript (malicioso) en la consola del navegador.
Para ser claros: tratar de bloquear a los hackers del lado del cliente es una mala idea en general; Esto es para proteger contra un ataque específico de ingeniería social .
Si terminó en el grupo de prueba y está molesto por esto, lo siento. Traté de hacer que la antigua página de exclusión (ahora página de ayuda ) sea lo más simple posible, sin dejar de ser lo suficientemente aterradora como para detener al menos a algunas de las víctimas.
El código real es bastante similar al enlace de @ joeldixon66 ; el nuestro es un poco más complicado sin ninguna buena razón.
Chrome envuelve todo el código de la consola en
... entonces el sitio redefine
console._commandLineAPI
para lanzar:Esto no es suficiente (¡pruébalo!) , Pero ese es el truco principal.
Epílogo: El equipo de Chrome decidió que derrotar la consola del JS del lado del usuario era un error y solucionó el problema , lo que invalidaba esta técnica. Posteriormente, se agregó protección adicional para proteger a los usuarios de self-xss .
fuente
console.log
.Encontré la secuencia de comandos de la consola de Facebook usando las herramientas de desarrollador de Chrome. Aquí está el script con cambios menores para facilitar la lectura. He eliminado los bits que no podía entender:
Con esto, el autocompletado de la consola falla en silencio mientras que las declaraciones escritas en la consola no se ejecutarán (se registrará la excepción).
Referencias
fuente
No pude lograr que activara eso en ninguna página. Una versión más robusta de esto lo haría:
Para aplicar estilo a la salida: Colores en la consola de JavaScript
Edit Thinking @ joeldixon66 tiene la idea correcta: deshabilitar la ejecución de JavaScript desde la consola «::: KSpace :::
fuente
window.console.log = function(){//empty}
y usa console.logAdemás de redefinir
console._commandLineAPI
, hay otras formas de entrar en InjectedScriptHost en los navegadores WebKit, para evitar o alterar la evaluación de las expresiones ingresadas en la consola del desarrollador.Editar:
Chrome ha solucionado esto en una versión anterior. - que debe haber sido antes de febrero de 2015, ya que creé la esencia en ese momento
Así que aquí hay otra posibilidad. Esta vez nos conectamos, un nivel por encima, directamente en
InjectedScript
lugar deInjectedScriptHost
oponernos a la versión anterior.Lo cual es bastante bueno, ya que puedes usar el parche directamente en
InjectedScript._evaluateAndWrap
lugar de tener que confiar,InjectedScriptHost.evaluate
ya que eso te da un control más preciso sobre lo que debería suceder.Otra cosa bastante interesante es que podemos interceptar el resultado interno cuando se evalúa una expresión y devolverla al usuario en lugar del comportamiento normal.
Aquí está el código, que hace exactamente eso, devuelve el resultado interno cuando un usuario evalúa algo en la consola.
Es un poco detallado, pero pensé ponerle algunos comentarios
Entonces, normalmente, si un usuario, por ejemplo, evalúa
[1,2,3,4]
, esperaría el siguiente resultado:Después de que monkeypatching
InjectedScript._evaluateAndWrap
evalúa la misma expresión, da el siguiente resultado:Como puede ver, la pequeña flecha izquierda, que indica la salida, todavía está allí, pero esta vez obtenemos un objeto. Donde el resultado de la expresión, la matriz
[1,2,3,4]
se representa como un objeto con todas sus propiedades descritas.Recomiendo tratar de evaluar esta y aquella expresión, incluidas las que generan errores. Es bastante interesante.
Además, echa un vistazo a la
is
-InjectedScriptHost
- objeto. Proporciona algunos métodos para jugar y obtener un poco de información sobre los aspectos internos del inspector.Por supuesto, puede interceptar toda esa información y aún así devolver el resultado original al usuario.
Simplemente reemplace la declaración de retorno en la ruta else por una
console.log (res)
siguiente areturn res
. Entonces terminarías con lo siguiente.Fin de Editar
Esta es la versión anterior que fue corregida por Google. Por lo tanto, ya no es posible.
Uno de ellos está enganchadoFunction.prototype.call
Chrome evalúa la expresión ingresada alcall
usar su función eval conInjectedScriptHost
asthisArg
var result = evalFunction.call(object, expression);
Teniendo en cuenta esto, se puede escuchar a la
thisArg
delcall
serevaluate
y obtener una referencia al primer argumento (InjectedScriptHost
)Podría, por ejemplo, arrojar un error, que la evaluación fue rechazada.
Aquí hay un ejemplo donde la expresión ingresada se pasa a un compilador CoffeeScript antes de pasarla a la
evaluate
función.fuente
Netflix también implementa esta característica
Simplemente anulan
console._commandLineAPI
para arrojar un error de seguridad.fuente
Esto es realmente posible ya que Facebook pudo hacerlo. Bueno, no las herramientas reales de desarrollador web, sino la ejecución de Javascript en la consola.
Vea esto: ¿Cómo deshabilita Facebook las herramientas de desarrollador integradas del navegador?
Sin embargo, esto realmente no hará mucho, ya que hay otras formas de eludir este tipo de seguridad del lado del cliente.
Cuando dice que es del lado del cliente, sucede fuera del control del servidor, por lo que no hay mucho que pueda hacer al respecto. Si se pregunta por qué Facebook sigue haciendo esto, esto no es realmente por seguridad sino para proteger a los usuarios normales que no conocen JavaScript del código (que no saben leer) en la consola. Esto es común para los sitios que prometen el servicio de auto-me gusta u otros bots de funcionalidad de Facebook después de hacer lo que le piden que haga, donde en la mayoría de los casos, le dan un fragmento de javascript para ejecutar en la consola.
Si no tienes tantos usuarios como Facebook, entonces no creo que sea necesario hacer lo que Facebook está haciendo.
Incluso si deshabilita Javascript en la consola, es posible ejecutar javascript a través de la barra de direcciones.
y si el navegador deshabilita javascript en la barra de direcciones, (cuando pega código en la barra de direcciones en Google Chrome, elimina la frase 'javascript:') pegar javascript en uno de los enlaces a través del elemento de inspección aún es posible.
Inspeccionar el ancla:
Pegar código en href:
La conclusión es la validación del lado del servidor y la seguridad debe ser lo primero, luego el lado del cliente después.
fuente
Chrome cambió mucho desde que Facebook podía desactivar la consola ...
Según marzo de 2017, esto ya no funciona.
Lo mejor que puede hacer es deshabilitar algunas de las funciones de la consola, por ejemplo:
fuente
Mi manera simple, pero puede ayudar a otras variaciones sobre este tema. Enumere todos los métodos y modifíquelos a inútiles.
fuente
Internamente, devtools inyecta un IIFE nombrado
getCompletions
en la página, llamado cuando se presiona una tecla dentro de la consola de Devtools.Mirando la fuente de esa función , utiliza algunas funciones globales que pueden sobrescribirse.
Al usar el
Error
constructor, es posible obtener la pila de llamadas, que incluirágetCompletions
cuando Devtools lo llame.Ejemplo:
fuente
Una solución simple!
fuente
console.log()
?console.log()
ya no importa cuando la consola se limpia constantemente :)Yo seguiría el camino de:
fuente
Esta no es una medida de seguridad para que el código débil se deje desatendido. Siempre obtenga una solución permanente para el código débil y asegure sus sitios web correctamente antes de implementar esta estrategia
Según mi conocimiento, la mejor herramienta sería agregar múltiples archivos javascript que simplemente cambien la integridad de la página a la normalidad al actualizar o reemplazar el contenido. Deshabilitar esta herramienta de desarrollador no sería la mejor idea, ya que omitirlo siempre está en duda, ya que el código es parte del navegador y no un servidor de representación, por lo que podría romperse.
Si debe
js file one
verificar los<element>
cambios en elementos importantesjs file two
yjs file three
comprobar que este archivo existe por período, tendrá una restauración de integridad completa en la página dentro del período.Tomemos un ejemplo de los 4 archivos y muestre lo que quiero decir.
index.html
mainfile.js
ps.js
ks.js
style.css
Ahora, esto es solo para mostrar que también funciona en todos los archivos y etiquetas
Si reúne todos estos archivos y crea el ejemplo, verá la función de esta medida. Esto evitará algunas inyecciones imprevistas si la implementa correctamente en todos los elementos importantes de su archivo de índice, especialmente cuando trabaja con PHP.
La razón por la que elegí volver a cargar en lugar de volver al valor normal por atributo es el hecho de que algunos atacantes podrían tener otra parte del sitio web ya configurada y lista, y disminuye la cantidad de código. La recarga eliminará todo el trabajo duro del atacante y probablemente irá a jugar a un lugar más fácil.
Otra nota: esto podría convertirse en una gran cantidad de código, así que manténgalo limpio y asegúrese de agregar definiciones a su lugar para facilitar las ediciones en el futuro. También configure los segundos a su cantidad preferida ya que los intervalos de 1 segundo en páginas grandes podrían tener efectos drásticos en las computadoras más antiguas que sus visitantes podrían estar usando
fuente