JSFuck es una esotérica subconjunto de JavaScript , donde el código está escrito utilizando sólo seis caracteres : [
, ]
, (
, )
, !
, y +
. El nombre se deriva de Brainfuck , un lenguaje de programación esotérico que también usa un alfabeto minimalista de solo puntuación . A diferencia de Brainfuck , que requiere su propio compilador o intérprete , JSFuck es un código JavaScript válido, lo que significa que los programas JSFuck se pueden ejecutar en cualquier navegador o motor web.que interpreta JavaScript. JSFuck es capaz de recrear toda la funcionalidad de JavaScript utilizando un conjunto de caracteres tan limitado porque JavaScript es un lenguaje de programación débilmente tipado y permite la evaluación de cualquier expresión como cualquier tipo. [1]
En julio de 2009, Yosuke Hasegawa creó una aplicación web llamada jjencode que podía codificar JavaScript arbitrario en una forma ofuscada utilizando solo los 18 símbolos []()!+,\"$.:;_{}~=
. [2] [3] En enero de 2010, se llevó a cabo una competencia informal en el foro "Ofuscación" del sitio de seguridad de la aplicación web sla.ckers.org para encontrar una manera de reducir el número mínimo de caracteres requerido a menos de ocho: []()!+,/
. Los colaboradores del hilo lograron eliminar la necesidad de los personajes ,
y /
. [4] En marzo de 2010, estaba disponible un codificador en línea llamado JS-NoAlnum que utilizaba solo el conjunto final de seis caracteres. [5]A fines de 2010, Hasegawa puso a disposición un nuevo codificador llamado JSF * ck que también usaba solo el mínimo de seis caracteres. [6] [7] En 2012, Martin Kleppe creó un proyecto "jsfuck" en GitHub , [8] y un sitio web JSFuck.com con una aplicación web que usa esa implementación del codificador. [9]
JSFuck se puede utilizar para evitar la detección de código malicioso enviado en sitios web , por ejemplo, en ataques de secuencias de comandos entre sitios (XSS). [10] Otro uso potencial de JSFuck radica en la ofuscación del código . Se ha utilizado una versión optimizada de JSFuck para codificar jQuery , una biblioteca de JavaScript , en una versión completamente funcional escrita con solo seis caracteres. [11]
El código JSFuck es extremadamente "detallado": en JavaScript, el código , que hace que se abra una ventana emergente con el texto "Hola mundo", tiene 21 caracteres. En JSFuck, el mismo código tiene una longitud de 4325 caracteres. [12] Ciertos caracteres individuales requieren mucho más de 1000 caracteres cuando se expanden como JSFuck. Esta sección ofrece una descripción general de cómo funciona esta expansión.alert("Hello World!")
El número 0 es creado por +[]
, donde []
es la matriz vacía y +
es el más unario , que se utiliza para convertir el lado derecho en un valor numérico (cero aquí). El número 1 se forma como +!![]
o +!+[]
, donde el valor booleanotrue
(expresado como !![]
o !+[]
en JSFuck) se convierte en el valor numérico 1 mediante el signo más antepuesto. Los dígitos del 2 al 9 se forman sumando true
el número apropiado de veces. Por ejemplo, en JavaScript true + true
= 2 y true
= !![]
= !+[]
, por lo tanto, 2 se puede escribir como !![]+!![]
o !+[]+!+[]
. Otros dígitos siguen un patrón similar. Los enteros que constan de dos o más dígitos se escriben, como una cadena, porconcatenando matrices de 1 dígito con el operador más. Por ejemplo, la cadena "10"
se puede expresar en JavaScript como [1] + [0]
. Reemplazando los dígitos con las respectivas expansiones JSFuck, esto cede [+!+[]]+[+[]]
. Para obtener un valor numérico en lugar de una cadena, se debe encerrar la expresión anterior entre paréntesis o corchetes y anteponer un signo más, dando como resultado 10
= +([+!+[]]+[+[]])
.
Algunas letras se pueden obtener en JSFuck accediendo a caracteres individuales en las representaciones de cadena de valores booleanos o numéricos simples como,,, con "false"
un indexador ( un número entre corchetes). Se necesitan otros trucos para producir otras letras, por ejemplo, al convertir la cadena en un número, lo que da , lo que a su vez hace que la letra sea accesible. [13]"true"
"NaN"
"undefined"
1e1000
Infinity
y