Javascript 使用nodejs&;expressjs:What';这是一种不使用模板将.env传递到html的好方法吗?

Javascript 使用nodejs&;expressjs:What';这是一种不使用模板将.env传递到html的好方法吗?,javascript,ajax,node.js,express,environment-variables,Javascript,Ajax,Node.js,Express,Environment Variables,我的html页面向节点发出AJAX请求以获取process.env。我那里没有密码或钥匙。但是,将来可能需要它。有没有一种安全的方法可以在不使用模板的情况下实现这一点 客户端 // source.html $.get( "/env", function( data ) {console.log(data);}); 服务器端 // index.js app.get('/source', function(req, res){ res.sendFile(__dirname + '/so

我的html页面向节点发出AJAX请求以获取process.env。我那里没有密码或钥匙。但是,将来可能需要它。有没有一种安全的方法可以在不使用模板的情况下实现这一点

客户端

// source.html    
$.get( "/env", function( data ) {console.log(data);});
服务器端

// index.js
app.get('/source', function(req, res){
  res.sendFile(__dirname + '/source.html');
});

app.get('/env', function(req, res) {
      res.send(process.env);
});
我研究了EJS模板,但对于传递process.env(如中所述),这似乎有些过分

想法:

  • App.get('/source',App.use(process.env.SOCKET\u ADDR))?我是否忽略了通过JS对象选项的快速路线
  • 不干净,但我可以单独为环境变量创建路由,而不是调用整个对象。基于同样的想法,创建一个不包含敏感变量的新env对象
  • 把它吸起来,然后

  • 听起来您有两个顾虑:安全性(可能现在不相关,但将来会相关)和演示(是否使用模板?)。我还不清楚你的演讲需要什么,但我会提供一些建议。我们从安全开始

    考虑到您将来可能会有公开敏感细节的环境变量,我建议将您返回的环境变量列为白名单。它将防止(或至少降低)敏感信息在未来意外暴露的可能性。白名单意味着你明确表示你让什么通过(黑名单意味着你明确表示你没有让什么通过)。下面是我将如何实现要返回的环境变量白名单(这只返回JSON;我们将在后面讨论演示):

    注意:我在这里使用了一些ES6功能。特别是箭头表示法函数和
    集合
    对象。这适用于节点的当前版本(v4.2.2及更高版本)

    <>这允许您指定您认为“安全”的环境变量暴露给世界。我在这里会非常小心,您可能会惊讶于什么环境变量会导致有经验的黑客成功利用。例如,我不会公开路径或术语,或者坦率地说,我没有为自己设置的任何东西。所以在这里要小心

    我认为在这种情况下,黑名单将是非常危险的(如果您添加了一个包含敏感信息的环境变量,您将不得不记住每次将其添加到黑名单),但为了完整性,这里是:

    const envBlacklist = new Set([
        "SOME_SECRET_VAR", "DB_PASSWORD",
        "WHATEVER_ELSE",
    ]);
    app.get('/env.json', function(req, res) {
        res.send(Object.keys(process.env)
            .filter(k => !envBlacklist.has(k))
            .reduce((a, k) => (a[k] = process.env[k], a), {})
        );
    });
    
    好的,现在我们来谈谈演示。到目前为止,我们刚刚返回了JSON(这就是为什么我将端点更改为
    GET/env.JSON
    ),它适合于前端演示。也就是说,您可以使用AJAX调用,然后使用jQuery或模板库动态构建HTML。但是,如果您想从服务器获取HTML,即使没有模板库,也很容易做到。下面是一个使用HTML
    的白名单示例:

    const envWhitelist=新集合([
    “TERM”、“SSH_TTY”、“PATH”、“SHELL”,
    “编辑器”、“语言”、“节点路径”,
    ]);
    app.get('/env',函数(req,res){
    const keys=Object.keys(process.env)
    .filter(k=>envWhitelist.has(k));
    res.send(“”)+
    keys.map(k=>''+k+''+process.env[k]+'')
    .连接(“)+”);
    });
    

    我不确定这个例子是否比使用模板好,但这是避免模板化的一种方法。

    听起来您有两个问题:安全性(可能现在不相关,但将来会有)和演示(是否使用模板?)。我还不清楚你的演讲需要什么,但我会提供一些建议。我们从安全开始

    考虑到您将来可能会有公开敏感细节的环境变量,我建议将您返回的环境变量列为白名单。它将防止(或至少降低)敏感信息在未来意外暴露的可能性。白名单意味着你明确表示你让什么通过(黑名单意味着你明确表示你没有让什么通过)。下面是我将如何实现要返回的环境变量白名单(这只返回JSON;我们将在后面讨论演示):

    注意:我在这里使用了一些ES6功能。特别是箭头表示法函数和
    集合
    对象。这适用于节点的当前版本(v4.2.2及更高版本)

    <>这允许您指定您认为“安全”的环境变量暴露给世界。我在这里会非常小心,您可能会惊讶于什么环境变量会导致有经验的黑客成功利用。例如,我不会公开路径或术语,或者坦率地说,我没有为自己设置的任何东西。所以在这里要小心

    我认为在这种情况下,黑名单将是非常危险的(如果您添加了一个包含敏感信息的环境变量,您将不得不记住每次将其添加到黑名单),但为了完整性,这里是:

    const envBlacklist = new Set([
        "SOME_SECRET_VAR", "DB_PASSWORD",
        "WHATEVER_ELSE",
    ]);
    app.get('/env.json', function(req, res) {
        res.send(Object.keys(process.env)
            .filter(k => !envBlacklist.has(k))
            .reduce((a, k) => (a[k] = process.env[k], a), {})
        );
    });
    
    好的,现在我们来谈谈演示。到目前为止,我们刚刚返回了JSON(这就是为什么我将端点更改为
    GET/env.JSON
    ),它适合于前端演示。也就是说,您可以使用AJAX调用,然后使用jQuery或模板库动态构建HTML。但是,如果您想从服务器获取HTML,即使没有模板库,也很容易做到。下面是一个使用HTML
    的白名单示例:

    const envWhitelist=新集合([
    “TERM”、“SSH_TTY”、“PATH”、“SHELL”,
    “编辑器”、“语言”、“节点路径”,
    ]);
    app.get('/env',函数(req,res){
    const keys=Object.keys(process.env)
    .filter(k=>envWhitelist.has(k));
    res.send(“”)+
    keys.map(k=>''+k+''+process.env[k]+'')
    .连接(“)+”);
    });
    
    我不确定我是否认为这个例子比使用temp更好
    const envWhitelist = new Set([
        "TERM", "SSH_TTY", "PATH", "SHELL",
        "EDITOR", "LANG", "NODE_PATH",
    ]);
    app.get('/env', function(req, res) {
        const keys = Object.keys(process.env)
            .filter(k => envWhitelist.has(k));
        res.send('<dl>' +
            keys.map(k => '<dt>' + k + '</dt><dd>' + process.env[k] + '</dd>')
                .join('') + '</dl>');
    });