¿Es posible escribir una expresión regular que verifique si una cadena (algún código) está minificada?

Muchos ofuscadores PHP / JS eliminan los espacios en blanco (entre otras cosas). Entonces, el código minificado final a veces se ve así:

PHP:
$a=array();if(is_array($a)){echo'ok';}

JS:
a=[];if(typeof(a)=='object'&&(a instanceof Array){alert('ok')}

En ambos casos no hay caracteres de espacio antes y después de "{", "}", ";", etc. También hay otros patrones que pueden ayudar. No espero una expresión regular de alta precisión, solo necesito una que verifique si al menos 100 caracteres de cadena se parecen a un código minificado. Gracias en consejo.

PROPÓSITOS: escáner de malware web

0
Ken 21 ago. 2011 a las 23:12

5 respuestas

La mejor respuesta

Creo que un minificador eliminará todos los caracteres de nueva línea, aunque es posible que todavía haya uno al final del archivo si el código minificado se vuelve a pegar en un editor de texto. Algo como esto probablemente será bastante preciso:

/^[^\n\r]+(\r\n?|\n)?$/

Eso solo prueba que no hay caracteres de nueva línea en todo, excepto posiblemente uno al final. Entonces no hay garantías, pero creo que funcionará bien en cualquier bloque de código largo.

2
Paul 21 ago. 2011 a las 19:23

Ejecútelo a través de un analizador para ese idioma en particular (incluso un prettifier podría funcionar bien) y modifíquelo para contar el número de caracteres no utilizados. Use el porcentaje de caracteres no utilizados frente al número de caracteres en los documentos como prueba de minificación. No creo que pueda hacer esto con precisión con expresiones regulares, aunque contar espacios en blanco frente al contenido del documento podría estar bien.

0
Chris Dennett 21 ago. 2011 a las 19:27

La respuesta corta es "no", regex no puede hacer esto.

Su mejor opción probablemente será hacer un análisis estadístico de los archivos fuente y compararlos con algunas heurísticas conocidas. Por ejemplo, al comparar los nombres de las variables con los que a menudo se encuentran en el código minimizado. Un archivo minimizado probablemente tenga muchos nombres de variables de un carácter, por ejemplo ... y no tendrá nombres de variables de dos caracteres hasta que se agoten todos los nombres de variables de un carácter ... etc.

Otra opción sería simplemente ejecutar el archivo fuente a través de un minimizador y ver si la salida es lo suficientemente diferente de la entrada. Si no, probablemente ya estaba minimizado.

Pero tengo que estar de acuerdo con la oración final de sg3s: si puede explicar por qué necesita esto, probablemente podamos proporcionarle respuestas más útiles a sus necesidades reales.

2
Flimzy 21 ago. 2011 a las 19:24

No se puede saber si se ha minimizado o simplemente se ha escrito así a mano (probablemente solo se aplica a guiones más pequeños). Pero puede verificar si no contiene espacios en blanco innecesarios.

Eche un vistazo al ofuscador / minificador de código abierto y vea qué reglas usan para eliminar el espacio en blanco. Validar si esas reglas se aplicaron debería funcionar, si la expresión regular se vuelve compleja, podría ser necesario un analizador simple.

Solo asegúrese de que los literales de cadena como a="if ( b )" estén excluidos.

0
kapex 21 ago. 2011 a las 19:25

No. Dado que la sintaxis / código y su intención no cambian y algunas personas que están muy familiarizadas con php y / o js escribirán funciones simples en una línea sin ningún espacio en blanco (yo: s).

Lo que podría hacer es contar todos los caracteres de espacio en blanco en una cadena, aunque esto tampoco sería confiable ya que para algunas cosas simplemente necesita espacio en blanco, como x instanceof y heh. Además, no todo el código se reduce y se agrupa en una sola fila (consulte la interfaz de usuario de jQuery), por lo que tampoco puede contar con eso ...

¿Quizás pueda explicar por qué necesita saber esto y podemos intentar encontrar una alternativa?

0
sg3s 21 ago. 2011 a las 19:20