我正在调试我的 NodeJS 应用程序时,我发现了这个巨大的事实:使用 jQuery,一个简单的
$.get(code_url)
其中
code_url
是指向服务器上 javascript 代码的 URL,会执行代码。
期望的是:
$.get("script.js", function(data) {
// data contains the content of 'script.js' as a string
// We can choose either to :
// - Append it to the DOM
// - Evaluate it using eval()
// - Store it for later use
});
但是,即使回调中没有执行任何操作,代码也确实被执行了。
我尝试重新创建一个几乎空的服务器,只用几行代码来确保它不是来自我的项目。即使总共十几行,我也能重现。
NodeJS 服务器:
const express = require('express');
const App = express();
App.use(express.static('www'));
App.listen(5000);
index.js(由index.html执行)
$(document).ready(function() {
$.get("utils.js")
});
utils.js(由服务器在
www/
中作为静态)
console.log("Hello World");
let a=1000;
console.log(Math.PI*a);
注意:问题似乎只发生在本地服务器上,但我仍然认为这是一个相当严重的问题。我只是无法下载任何代码而不立即执行它......来吧。我发现了一个巨大的 jQuery bug 吗?
已测试
服务器必须返回
Content-type: text/javascript
标头。
如果您没有为
dataType
指定 $.get()
参数,jQuery 会从 Content-Type 标头推断类型。 text/javascript
对应于dataType = "script"
。从文档:
“script”:将响应评估为 JavaScript 并将其作为纯文本返回。
换句话说,
$.get("script.js")
实际上等同于$.getScript("script.js")
@Pointy 给出的答案:
$(document).ready(function() {
$.get("utils.js", function(data){
}, "text/plain")
});
防止代码被执行