web-dev-qa-db-fra.com

Une page Web peut-elle détecter un script utilisateur tampermonkey?

Ma question est en quelque sorte double. Premièrement , comment fonctionne le modèle sandbox, comment il affecte le script utilisateur, ce qui est accessible/vu depuis la page Web et le point de vue du script utilisateur, et si vous utilisez un un modèle de sandbox différent affecte la page en pouvant remarquer que votre script est injecté dans la page (ou non). Deuxièmement , comment les scripts sont-ils injectés dans la page, et la page peut-elle la détecter?

Premier

D'après ce que je peux voir, lorsque vous utilisez @grant none, le bac à sable est désactivé et vous aurez accès à la page Web et à son javascript. SI vous apportez des modifications au javascript et/ou au DOM, il est éventuellement détectable par la page.

Si je comprends bien, si vous utilisez @grant unsafeWindow, votre script sera isolé dans son propre contexte js, tout ce que vous faites pour window ne sera PAS vu par la page Web, MAIS vous pouvez accéder à la page Web et au javascript via unsafeWindow. Vous aurez un accès régulier au DOM, par ex. document renvoie le document de page standard au lieu de vous dire unsafeWindow.document. De toute évidence, toute modification que vous apportez au contexte DOM ou page js (par exemple, unsafeWindow.foo = 'bar';) sera toujours détectable. La raison pour laquelle il s'agit de unsafe n'est pas due à sa détection ou non, mais parce que vous pouvez potentiellement donner à la page non approuvée un accès privilégié à GM_* fonctionne dans ce mode, (qui ne sont pas accordées en mode normal, ce qui signifie que @grant GM_* pour toute fonction isolera le contexte js et vous perdrez l'accès au contexte js de la page à moins que vous @grant unsafeWindow)

Deuxième

Comment les scripts sont-ils injectés dans la page? Est-il possible que la page Web puisse remarquer l'injection de script utilisateur (en supposant que le script utilisateur ne modifie RIEN sur la page).

Par exemple, si un script a été injecté à l'aide d'une balise script, je pense que la page pourrait éventuellement remarquer l'injection de script, voir même son code?

Le modèle de bac à sable a-t-il un rôle dans la façon dont cela se produit et le rend-il "plus sûr" de ne pas être vu? Par exemple, si les contextes js sont isolés si vous utilisez @grant unsafeWindow, alors peut-être que le js sur la page Web ne peut même voir aucun événement de chargement de script utilisateur, ce qui rend @grant unsafeWindow fondamentalement plus sûr, À MOINS QUE vous n'alliez modifier le DOM ou unsafeWindow bien sûr.

Je suppose également qu'il n'y a pas de fuite de fonctions spéciales, d'objets, de propriétés, etc. (tels que GM_info à la page Web qui trahirait l'existence de tampermonkey?). Ni dans @grant none mode ou @grant unsafeWindow mode (à condition que vous n'ayez rien divulgué sur la page)

Cela me permet de penser que unsafeWindow est en fait plus sûr en termes de non-détection (car les contextes js sont isolés), tant que vous ne modifiez rien (et surtout N'exposez PAS les privilèges GM_* fonctionne sur unsafeWindow). Par exemple, si vous avez utilisé un eventListener sur @grant none, il peut être détecté, mais si vous l'utilisez en @grant unsafeWindow mode, il peut ne pas être détecté à cause de l'isolement? De plus, s'il était possible pour une page de détecter le chargement du script utilisateur (je ne sais pas si c'est réellement possible ou non), elle ne saurait pas si les contextes js sont isolés

Dans un bref résumé, une page peut-elle détecter l'existence de votre script utilisateur ou de tampermonkey SI vous ne la trahissez pas?

L'une de mes pensées ci-dessus est-elle incorrecte dans n'importe quel domaine, et si oui, comment cela fonctionne-t-il réellement?

Mise à jour

Un petit renseignement pour clarification:

Un script utilisateur lit uniquement les informations passivement à partir de la page (peut-être en utilisant un MutationObserver). Il ne modifie en rien quoi que ce soit, n'utilise aucune bibliothèque js (ni à partir du script utilisateur ni de la page Web), pas d'appels ajax, pas de nœuds de script, certainement pas de clics, etc. Le script PEUT lire certaines informations de JS vars sur la page (supposons que ces variables et fonctions ne sont pas piégées), ainsi que l'utilisation d'un WebSocket (service interne). Utiliser également un IIFE. La question est donc principalement: est-ce que tampermonkey en soi (et s'il exécute un script de page) est détectable?

Dans cette réponse: https://stackoverflow.com/a/8548311 Je peux exclure 1, 4, 5, 6 et 7; probablement 2 et 3 aussi, mais je ne sais pas si le tamponnement en soi affecterait l'un de ces

8
John Doe

Les navigateurs et Greasemonkey/Tampermonkey/Violentmonkey ont (principalement) amélioré la façon dont ils effectuent l'injection, le cadrage et le bac à sable. Les scripts utilisateur ne sont pas injectés en utilisant le <script> balises (bien que votre script doive parfois créer de telles balises).

En fait, il n'est presque pas nécessaire d'utiliser un IIFE de nos jours.

Mais, en plus des méthodes de détection dans la question précédemment liée :

  1. Dans @grant none mode, si vous @require une bibliothèque qui se copie dans window scope , la page peut la voir. La plupart des bibliothèques ne le font pas, mais celle qui le fait est jQuery .
  2. Tampermonkey fournit en fait la version de script installée aux sites qui sont sur la liste blanche dans les paramètres avancés. C'est principalement pour les hôtes de script comme greasyfork.org.
  3. Je ne sais pas si une page peut détecter les WebSockets utilisés par un script utilisateur. J'en doute.

En bout de ligne, c'est pour un script utilisateur "en lecture seule" , qui ne require les bibliothèques globales dans @grant none mode, la page ne peut pas le détecter.
(Sauf si la page est greasyfork.org, etc., et que vous avez le Allow communication with cooperate pages réglage à la valeur par défaut.)

Si vous découvrez une fuite par laquelle une page peut détecter un script "passif", faites-le nous savoir et il y a de fortes chances qu'il puisse être bouché.

3
Brock Adams

Comme mentionné par la réponse https://stackoverflow.com/a/8548311 si vous faites quelque chose comme , il est certainement détectable. Mais, selon ce que vous voulez faire avec le script tampermonkey, il sera plus facile ou plus difficile à détecter, et dans certains cas impossible .

D'après ce que vous demandez, il semble que ce que vous voulez faire, c'est simplement invoquer un IIFE à partir de la page, et arrêtez-vous là, "disons qu'il ne fait que lire des informations".

C'est vraiment difficile à capturer, et généralement pour cela, la page doit comparer les profileurs et les temps d'exécution et ceux des autres utilisateurs avec vous, ou d'autres choses amusantes, et il n'y a pas de véritable moyen facile de savoir si l'utilisateur a exécuté JS supplémentaire dans la page (tant que vous utilisez un IIFE) qui n'a AUCUN EFFET SECONDAIRE . Je ne dis pas qu'il est 100% indétectable, mais disons que c'est vraiment très délicat.

Si vous allez modifier le DOM, faire des appels API à un service externe ou interne, de faux mouvements de l'utilisateur ou d'autres choses de ce genre, vous allez être détecté . Cela dépend donc de ce que vous voulez faire de la page, mais vous pouvez être détecté "assez facilement".

Dans un bref résumé, une page peut-elle détecter l'existence de votre script utilisateur ou de tampermonkey SI vous ne la trahissez pas?

Oui, une page peut les détecter dans les cas où vous laissez une trace dans la page (comme défini ci-dessus). Gardez à l'esprit que cela ne se produira que s'il y a une raison pour que la page veuille savoir si cela se produit. Gardez également à l'esprit qu'aucune page n'implémentera quelque chose comme ça juste pour le plaisir, alors ne vous attendez pas à ce que les pages normales s'en plaignent.

2
Alejandro Vales