代码之家  ›  专栏  ›  技术社区  ›  Tricotou

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

  •  0
  • Tricotou  · 技术社区  · 1 年前

    我在调试我的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);
    

    和BOOM,执行代码: Google Chrome console showing code execution

    注意:问题似乎只发生在本地服务器上,但我仍然认为这是一个相当严重的问题。我只是无法在不实时执行的情况下下载任何代码。。。拜托。我发现一个巨大的jQuery错误了吗?

    测试时间

    • jQuery 3.6.3和3.7.1
    • 谷歌浏览器(版本123.0.6312.1122(官方版本)(64位))
    • Linux Ubuntu 22.04
    2 回复  |  直到 1 年前
        1
  •  2
  •   Barmar    1 年前

    服务器必须返回 Content-type: text/javascript 头球

    如果您没有指定 dataType 的论点 $.get() ,jQuery从Content-type标头推断类型。 text/javascript 对应于 dataType = "script" 。从 documentation :

    “script”:将响应求值为JavaScript,并以纯文本形式返回。

    换句话说, $.get("script.js") 实际上相当于 $.getScript("script.js")

    如果要在不进行求值的情况下检索源代码,请指定 text dataType显式:

    $.get("script.js", "text");
    
        2
  •  1
  •   Tricotou    1 年前

    @Pointy给出的答案:

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

    阻止代码执行