我正在构建一个Chrome扩展程序,可以从浏览器操作中检测自定义javascript代码。
到目前为止,我设法检测到自定义代码何时在页面本身,但是当从外部.js文件加载时我无法检测到它(这就是为什么问题,我想检测<script src="http://www.externaldomain.com/file.js"></script>
我知道这可以实现,因为谷歌在其标签助手&#34;扩展,但检查他们的源代码,一切都缩小了,很难弄清楚他们是如何做到的。 eg. Tag Assistant
你知道他们使用了哪种API /技巧吗?
答案 0 :(得分:1)
当网站加载时,它会运行所有类似于Chrome控制台的脚本。如果你使用控制台运行alert("hello")
,它将运行一次,你将无法使用javascript将其恢复。类似地,嵌入式js文件都运行一次,你不能只是查看html或其他任何地方来获取代码,因为js文件在运行后被卸载。所有函数都存储在变量,与这些函数相关的事件中,等等。
你可以做什么,而且可能需要做的是使用ajax重新获取这些文件。
我认为这正是标签助手的作用。 看了一会后我发现了这个:
//for each document.script, get the src, and load it with ajax using the function gf(src,return function), and send the response.responseText to the text identification functions
cf.prototype.qa = function(a, b) {
var c = {};
Ea(document.scripts, function(d) {//for each
!d.src || "" == d.src || c[d.src] || ef(this, d.src) || d.src == a || (c[d.src] = !0, gf(d.src, function(a) {
cf.M().W.forEach(function(c) {
c.u() && (c = c.qa(a.responseText, d.src), c.length && b(c, d.src))
})
}))
}, this)
};
function gf是一个带回调函数的简单ajax调用
gf = function(a, b) {
try {
var c = new XMLHttpRequest;
c.open("GET", a, !0);
var d = !1;
c.onreadystatechange = function() {
d || 4 != c.readyState || 200 != c.status || (d = !0, b(c))
};
c.send()
} catch (e) {}
}
源自chrome-extension://kejbdjndbnbjgmefkgdddjlbokphdefk/tag_assistant.js(内容脚本)
看看标记助手做了什么,我建议你获取每个脚本元素,检索它的src,并在你的内容脚本中运行一个简单的ajax调用,就像这个页面上那样:http://code.tutsplus.com/articles/how-to-make-ajax-requests-with-raw-javascript--net-4855
//for each script, get its src,and do whatever you want with it
for(i=0;i<document.scripts.length;i++){
load(document.scripts[i].src, function(xhr){
myCodeAnalyzingFunction(xhr.responseText)
})
}