Soy un desarrollador de juegos JS que ha estado tratando de combatir los scripts de tampermonkey desde hace un tiempo. Se me ocurrió una solución para las personas que se conectan a WebSockets donde haría que el WebSocket arrojara un error new WebSocket(0); ( 0 arroja un error debido a que es un número)
let output; try { output = new target(...args); } catch(e) { let source = e.stack.substring(e.stack.indexOf("("), 1 + e.stack.indexOf(")")); e.stack = e.stack.replace(source, "nothing to see here"); throw e; }¡Este código hizo que la pila del error tuviera toda la información que estaba buscando reemplazada!
Estuve mirando Object.defineProperty y me preguntaba cómo podría evitar que se modifique la pila de un error antes de tener acceso a ese error específico. Y si alguien tiene otras formas de evitar que se cargue o ejecute un script, ¡me encantaría escucharlas!
Una cosa que podría hacer es Object.freeze el error antes de lanzarlo. Esto evitaría que la gente altere el contenido del objeto.
Así por ejemplo:
try { new WebSocket(0); } catch (wsErr) { throw Object.freeze(wsErr); }El código que detecta su error e intenta modificarlo no podrá modificarlo. Esto debería funcionar ya que hará que el código que estaba alterando el error arroje lo siguiente:
Cannot assign to read only property 'stack' of object ''La otra cosa que deberá considerar es que en su código donde está detectando el error, tampoco podrá modificar su contenido. Por lo general, con errores, eso no es un gran problema. La manipulación de errores es una de las únicas razones que se me ocurren para modificar el error.