$.get(code_url) 执行返回的代码,不使用 eval() 也不将其附加到 DOM。 jQuery 安全失败?

问题描述 投票:0回答:2

我正在调试我的 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 吗?

已测试

  • jQuery 3.6.3 和 3.7.1
  • Google Chrome(版本 123.0.6312.122(官方版本)(64 位))
  • Linux Ubuntu 22.04
javascript jquery node.js google-chrome security
2个回答
0
投票

服务器必须返回

Content-type: text/javascript
标头。

如果您没有为

dataType
指定
$.get()
参数,jQuery 会从 Content-Type 标头推断类型。
text/javascript
对应于
dataType = "script"
。从文档

“script”:将响应评估为 JavaScript 并将其作为纯文本返回。

换句话说,

$.get("script.js")
实际上等同于
$.getScript("script.js")


0
投票

@Pointy 给出的答案:

$(document).ready(function() {
    $.get("utils.js", function(data){
        
    }, "text/plain")
});

防止代码被执行

© www.soinside.com 2019 - 2024. All rights reserved.