10
votes

Injecter JavaScript dans une fonction JavaScript

J'ai une question étrange dans laquelle j'ai besoin d'injecter du JavaScript dans une autre fonction JavaScript. J'utilise un cadre qui est verrouillé afin que je ne puisse pas changer la fonction existante.

Qu'est-ce que j'ai, c'est quelque chose comme ça Fonction DOSOMODIAT () { ... }

... ***

Je peux manipuler le *** (ci-dessus), mais je ne peux pas changer la fonction dosomething ... Au lieu de cela, j'ai besoin d'une manière ou d'une autre injecter quelques lignes de code à la fin du code dosage.

La raison pour laquelle je dois faire cela est que le framework personnalisé appelle DOSOMOD () et il en résulte un ID étant renvoyé du serveur que j'ai besoin d'extraire. Cet identifiant est uniquement référencé à l'intérieur de la fonction DOSOMPHOIGHT afin que je ne puisse pas l'attraper à moins que je n'injecte du code à cette fonction (sauf si vous avez manqué quelque chose).

Y a-t-il un moyen de faire cela?


2 commentaires

Comment la fonction est-elle "verrouillée"?


Duplicaillier possible de Y a-t-il un moyen de Enveloppez toutes les méthodes JavaScript avec une fonction?


7 Réponses :


0
votes

Les fonctions sont des valeurs de première classe dans JavaScript, ce qui signifie que vous pouvez les stocker dans des variables (et, en fait, déclarer une fonction nommée attribue essentiellement une fonction anonyme à une variable).

Vous devriez pouvoir faire quelque chose Comme ceci: xxx

(mais je pourrais avoir tort. Mon javascript est un peu rouillé.;))


1 commentaires

Si j'avais la question à savoir, cela ne vous aidera pas ici, car le problème est d'extraire la valeur d'une variable locale qui est uniquement référencée à l'intérieur dossomique . Et la nouvelle version de Dosomething ne peut pas faire référence aux variables à l'intérieur de l'ancien.



6
votes

alias IT.

var oldDoSomething = doSomething;
doSomething = function() {
  // Do what you need to do.
  return oldDoSomething.apply(oldDoSomething, arguments);
}


2 commentaires

Il a besoin d'accès à une variable qui est scopée à la fonction d'origine


Mauvaise réponse. Nécessite un cas par utilisation de cas.



0
votes

Je ne peux pas changer la fonction dosomething ... Au lieu de cela, j'ai besoin d'une manière ou d'une autre injecter quelques lignes de code à la fin du code dosage

injecter quelques lignes à la fin du Dosomething Le code sonne comme modifiant le Dosomethant Fonction, à moi. Je pense que malheureusement que vous êtes foutu.

(Je suis un peu brumeux sur tout cela, mais je pense que les fonctions sont de la manière dont les personnes qui se soucient de telles choses mettent en œuvre des informations se cachent dans JavaScript, précisément parce que vous ne pouvez pas accéder à leur portée de l'extérieur.)


0 commentaires

1
votes
function doSomething(){ document.write('Test'); return 45; } 
var code = 'myDoSomething = ' + doSomething + '; function doSomething() { var id = myDoSomething(); document.write("Test 2"); return id; }';
eval(code)
doSomething();

0 commentaires

2
votes

Je ne suis pas sûr de ce que vous entendez par "verrouillé" - JavaScript est interprété par votre navigateur. Même s'il a été minifié ou codé, vous pouvez toujours copier la source de cette fonction de la source de la page du script. À ce stade, vous réaffectez la fonction d'origine à l'une de vos propres conceptions, qui contient le code copié plus le vôtre.

var id;
var myFunction = function() {
  // code copied from their source, which contains the variable needed

  // insert  your own code, such as for copying the needed value
  id = theirIDvalue;

  // return the value as originally designed by the function
  return theirValue;
};

theirObject.theirFunction = myFunction;


0 commentaires

3
votes

Merci pour tous vos commentaires. Chaque réponse m'a donné un indice et en tant que tel, j'ai proposé la solution suivante.

<body>
<script type="text/javascript">
    var val;
    function doSomething(item1, item2) {
        var id = 3;
    }
    function merge() {
        var oScript = document.createElement("script");
        var oldDoSomething = doSomething.toString();
        oScript.language = "javascript";
        oScript.type = "text/javascript";
        var args = oldDoSomething.substring(oldDoSomething.indexOf("(") + 1, oldDoSomething.indexOf(")"));
        var scr = oldDoSomething.substring(oldDoSomething.indexOf("{") + 1, oldDoSomething.lastIndexOf("}") - 1);
        var newScript = "function doSomething(" + args + "){" + scr + " val = id; }";
        oScript.text = newScript;
        document.getElementsByTagName('BODY').item(0).appendChild(oScript);
    }

    merge();

</script>
<input type="button" onclick="doSomething();alert(val);" value="xx" />


2 commentaires

Une meilleure solution (ne nécessite pas de manipulation DOM, est pur JavaScript): Stackoverflow.com/a/9134757/39722


@Bernhardhofmann qui ne résout pas le problème. La question était spécifiquement avantageuse



4
votes

Modifier la fonction en travaillant avec les chaînes de code source peut être assez simple. Pour le faire pour une instance spécifique, essayez:

...
    function alter(func, replacer) {
        var newFunc = replacer(eval('window.' + funcName).toString());
        eval.call(window, newFunc);
    }
...
function Foo() {}
Foo.prototype.bar = function () { var secret=0x09F91102; }
...
after('Foo.prototype.bar', 'return secret;');


2 commentaires

Cela ne fonctionnera pas dans le cas général car la fonction peut exécuter un retour à tout moment plus tôt afin que ce soit peut ne pas atteindre le code injecté.


@ Tonyo'hagan: merci; Cela devrait être résolu maintenant par l'utilisation de essayer ... enfin .