有没有办法静态评估JavaScript中函数的参数?

时间:2016-05-13 13:29:01

标签: javascript node.js

我正在开发一个工具(使用node.js构建)来修改每个请求的网页的某些值。

举个例子,如果我的html文档是这样的元素:

<div id="mydiv"> This is a div </div>

我的工具会在特定时刻将其更新为:

<div id="aka67213h82h7"> This is a div </div>

价值总是不同的。这是随机的。我的目标是阻止其他人使用此属性来篡改或从我的网页中提取信息。

现在,为了保持一切正常,我还需要更新CSS文件和JS文件。我假设一个网站只有HTML,CSS和JavaScript代码。 CSS文件没有问题,我正在处理它们。但JS脚本是一个不同的故事..

如果我有这行代码:

var element = document.getElementById("mydiv");

我想更新该行并将"mydiv"更改为"aka67213h82h7"。这是可能的,我这样做。但是,如果我们将代码重写为:

var idOfElement = "mydiv";
var element = document.getElementById(idOfElement);

我唯一能提取的是idOfElement是一个包含我想要更新的值的变量。这只是一个简单的例子,因为参数也可以是performFunction()等等......

如果像getElementById()这样的函数的参数是Literal我能够做我想要的。但如果是标识符或二进制表达式等,这就成了我的问题。那么,我怎样才能确定那一刻这些论点的价值呢?

2 个答案:

答案 0 :(得分:0)

如果我做得对,你可以用:

更新你的身份证
elements.id = 'randomValue';

答案 1 :(得分:0)

document.getElementById()元素内的script每次调用都匹配的方法替换id元素中的script和元素本身替换为{{1}生成的随机字符串}}

URL.createObjectURL()
window.onload = function() {
  var script = document.scripts[0];
  var ids = script.textContent.match(/document.getElementById\(.+\)/g);
  var _oldids = ids.toString()
                .replace(/document|\.getElementById|\(|\)|,/g, "")
                .split("");
  var _newids = [];
  _oldids.forEach(function(id) {
    var _id = URL.createObjectURL(new Blob([]));
    URL.revokeObjectURL(_id);
    _id = _id.replace(/^blob\:.+\//g, "");
    _newids.push(_id);
    script.textContent = script.textContent
                         .replace(new RegExp('"' + id + '"'), '"' + _id + '"');
    document.getElementById(id).id = _id;
  });
  
  console.log(_oldids, _newids, document.documentElement.outerHTML); 
}