Javascript 如何在nodejs中混淆http-GET-in浏览器上的客户端js文件?

Javascript 如何在nodejs中混淆http-GET-in浏览器上的客户端js文件?,javascript,node.js,obfuscation,Javascript,Node.js,Obfuscation,我在nodejs中有express应用程序: var app = express(); // view engine setup app.set('views', path.join(__dirname, 'views')); app.set('view engine', 'ejs'); app.use(logger('dev')); app.use(bodyParser.json()); app.use(bodyParser.urlencoded({ extended: false }))

我在nodejs中有express应用程序:

var app = express();

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');

app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));

app.use('/', routes);
app.use('/users', users);

进入浏览器的我的js文件位于/public文件夹中。我想在运行时自动混淆它们,所以很难在浏览器中读取它们。是否可以以某种方式调整此应用程序设置?

因此,当javascript发送到浏览器时,您实际上无法阻止用户阅读javascript。你可以让它变得非常困难,但是一个有决心的用户总是能够通过自动化工具和手工劳动的组合将它转换成可读的东西

简而言之,JavaScript或任何代码都没有DRM。如果您想保护脚本中的知识产权,请在脚本上添加版权声明。如果你认为有人偷了它们,就去找律师

对你的Java脚本来说,这当然是值得的,但在我看来,混淆它们的唯一原因是因为你愚蠢的老板让你这么做

如果您想混淆它,请查看此问题的答案:


请注意,混淆相当昂贵,所以您确实不希望在运行时进行混淆。当Java脚本使用构建工具(如grunt或我个人更喜欢grunt)进行更改时,您应该简单地将其应用于Java脚本。这些系统有插件来执行模糊处理

因此,当javascript被发送到浏览器时,实际上不能阻止用户阅读它。你可以让它变得非常困难,但是一个有决心的用户总是能够通过自动化工具和手工劳动的组合将它转换成可读的东西

简而言之,JavaScript或任何代码都没有DRM。如果您想保护脚本中的知识产权,请在脚本上添加版权声明。如果你认为有人偷了它们,就去找律师

对你的Java脚本来说,这当然是值得的,但在我看来,混淆它们的唯一原因是因为你愚蠢的老板让你这么做

如果您想混淆它,请查看此问题的答案:


请注意,混淆相当昂贵,所以您确实不希望在运行时进行混淆。当Java脚本使用构建工具(如grunt或我个人更喜欢grunt)进行更改时,您应该简单地将其应用于Java脚本。这些系统有插件来执行模糊处理

不要在运行时混淆。创建一个使代码模糊的构建步骤,并在生产中提供模糊代码

安装UglifyJS:

npm安装-g uglify js

然后可以运行以下命令来混淆代码:

uglifyjsdist/script.js

或者,安装grunt和uglify插件:

npm安装-g grunt cli

npm安装-保存开发grunt grunt contrib uglify

在项目的根目录中创建名为GrunFile的文件,该文件包含以下内容:

'use strict';
module.exports = function (grunt) {
    grunt.loadNpmTasks('grunt-contrib-uglify');
    grunt.initConfig({
        uglify: {
            all: {
                files: {
                    'public/scripts.js': 'src/**/*.js'
                }
            }
        }
    });
    grunt.registerTask('default', ['uglify']);
};
从项目中的任何地方运行grunt,以混淆代码。使用public/更新index.html文件,以加载经过模糊处理的连接脚本

如果顺序很重要,请按顺序列出脚本:

files: {
    'public/scripts.js': [
        'src/1.js',
        'src/3.js',
        'src/2.js'
    ]
}

不要在运行时混淆。创建一个使代码模糊的构建步骤,并在生产中提供模糊代码

安装UglifyJS:

npm安装-g uglify js

然后可以运行以下命令来混淆代码:

uglifyjsdist/script.js

或者,安装grunt和uglify插件:

npm安装-g grunt cli

npm安装-保存开发grunt grunt contrib uglify

在项目的根目录中创建名为GrunFile的文件,该文件包含以下内容:

'use strict';
module.exports = function (grunt) {
    grunt.loadNpmTasks('grunt-contrib-uglify');
    grunt.initConfig({
        uglify: {
            all: {
                files: {
                    'public/scripts.js': 'src/**/*.js'
                }
            }
        }
    });
    grunt.registerTask('default', ['uglify']);
};
从项目中的任何地方运行grunt,以混淆代码。使用public/更新index.html文件,以加载经过模糊处理的连接脚本

如果顺序很重要,请按顺序列出脚本:

files: {
    'public/scripts.js': [
        'src/1.js',
        'src/3.js',
        'src/2.js'
    ]
}

您可以在节点应用程序中使用UglifyJs,并使用它做您需要的事情。查看他们的文档以了解更多详细信息

来自不合格文档的示例

var jsp = require("uglify-js").parser;
var pro = require("uglify-js").uglify;

var orig_code = "... JS code here";
var ast = jsp.parse(orig_code); // parse code and get the initial AST
ast = pro.ast_mangle(ast); // get a new AST with mangled names
ast = pro.ast_squeeze(ast); // get an AST with compression optimizations
var final_code = pro.gen_code(ast); // compressed code here

旁白:人们注意到它很慢,诸如此类的话当然都是正确的,但是,如果你需要它,我只是不明白为什么要对一个明确的问题做出判断并发表意见。

你可以在你的节点应用程序中使用UglifyJs,并使用它做你需要做的事情。查看他们的文档以了解更多详细信息

来自不合格文档的示例

var jsp = require("uglify-js").parser;
var pro = require("uglify-js").uglify;

var orig_code = "... JS code here";
var ast = jsp.parse(orig_code); // parse code and get the initial AST
ast = pro.ast_mangle(ast); // get a new AST with mangled names
ast = pro.ast_squeeze(ast); // get an AST with compression optimizations
var final_code = pro.gen_code(ast); // compressed code here
旁白:人们注意到它很慢,诸如此类的话当然都是正确的,但是,如果你需要它,我就是不明白为什么要对一个明确的问题做出判断并发表意见。

我的建议很容易被忽略,但如果不小心,我们可能会被困住。它只是客户机部分,而不是nodejs部分

仅页面的实时视图 您可以使用javascript替换或删除脚本标记,以便在页面的实时视图中隐藏该标记。但是如果您直接观看网络,您可以很容易地看到javascript文件/代码

<div id="RemoveMe0">
    <script type="text/javascript">
        //This code it is hidden to live view.
        var my_var = 5 + 5;

        $('#RemoveMe0').remove();
        //or document.getElementById("RemoveMe0").innerHTML = "";
    </script>
</div>
对于include javascript:

<div id="RemoveMe1">
    <script type="text/javascript" src="Javascript/MyJS.js"></script>
    <script>
        //Your include it is hidden to live view.
        $('#RemoveMe1').remove();
    </script>
</div>
只有直视 把你的文件放在一个文件夹里 将HTML文件myfile.js改为myfile.HTML,像这样在直接视图中可以执行javascript函数

function Hello() {
    alert("Hello");
}
Hello();
//<script>document.body.innerHTML = "";</script>
结论:

对于此技巧,请重命名文件或使用.htaccess。和第一个提示一样,如果你观看网络,你会看到完整的文件

或者缩小/解析JS 您可以使用如下工具:

:此工具使用eval函数,并尝试使脚本复杂化。 :使初学者的代码复杂化,容易忽略。 :优化、压缩和缩小代码。它是生产环境的自然工具。 我的建议很容易被忽略,但如果不小心,我们可能会被困住。它只是客户机部分,而不是nodejs部分

仅页面的实时视图 您可以使用javascript替换或删除脚本标记,以便在页面的实时视图中隐藏该标记。但是如果您直接观看网络,您可以很容易地看到javascript文件/代码

<div id="RemoveMe0">
    <script type="text/javascript">
        //This code it is hidden to live view.
        var my_var = 5 + 5;

        $('#RemoveMe0').remove();
        //or document.getElementById("RemoveMe0").innerHTML = "";
    </script>
</div>
对于include javascript:

<div id="RemoveMe1">
    <script type="text/javascript" src="Javascript/MyJS.js"></script>
    <script>
        //Your include it is hidden to live view.
        $('#RemoveMe1').remove();
    </script>
</div>
只有直视 将您的文件放在一个HTML文件myfile.js到myfile.HTML中,像这样在一个直接视图中,您可以执行一个javascript函数

function Hello() {
    alert("Hello");
}
Hello();
//<script>document.body.innerHTML = "";</script>
结论:

对于此技巧,请重命名文件或使用.htaccess。和第一个提示一样,如果你观看网络,你会看到完整的文件

或者缩小/解析JS 您可以使用如下工具:

:此工具使用eval函数,并尝试使脚本复杂化。 :使初学者的代码复杂化,容易忽略。 :优化、压缩和缩小代码。它是生产环境的自然工具。
您可以使用命令行实用程序混淆代码,例如:

app.use('/javascripts',function(req,res,next){
    if (process.env.OBFUSCATE != 1){
        next();
    }
    var cmd = "java -jar ./gcc/compiler.jar ./public/javascripts" + req.url;// + "> ./tmp" + req.url + ".tmp";
    exec(cmd,function (error, stdout, stderr){
        res.write(stdout);
        res.end();
        if(error !== null){
            console.log('exec error: ' + error);
        }
    });
});

您可以使用命令行实用程序混淆代码,例如:

app.use('/javascripts',function(req,res,next){
    if (process.env.OBFUSCATE != 1){
        next();
    }
    var cmd = "java -jar ./gcc/compiler.jar ./public/javascripts" + req.url;// + "> ./tmp" + req.url + ".tmp";
    exec(cmd,function (error, stdout, stderr){
        res.write(stdout);
        res.end();
        if(error !== null){
            console.log('exec error: ' + error);
        }
    });
});


你为什么一开始就试图混淆代码?如果您担心有人阅读它,而他们会发现它到底做了什么,那么您可能不应该将它发送到浏览器。它应该在浏览器中执行,但不应该是用户可读的。这就是模糊处理。你为什么一开始就试图模糊代码?如果您担心有人阅读它,而他们会发现它到底做了什么,那么您可能不应该将它发送到浏览器。它应该在浏览器中执行,但不应该是用户可读的。这就是混淆。你将如何去混淆:???@stiv:这段代码甚至没有运行,但firefox的旧版本会将函数的toString代码转换为无注释的解析表示,因此,它很可能会将其简化为更基本的术语……您将如何消除此缺陷:??@stiv:该代码甚至不会运行,但firefox的旧版本会将函数的toString代码转换为无注释的解析表示形式,因此,它很可能会将其简化为更基本的术语……我需要运行时模糊处理,这太愚蠢了。大多数模糊处理程序都非常慢,访问者不会在每次GET上都等待代码缩小到服务器端或客户端。如果您在客户端执行此操作,则毫无意义,因为任何人都可以打开“网络”选项卡,检查在脚本模糊化之前传递脚本的HTTP请求体。是否禁止缓存?您可以缓存运行时模糊化的脚本,但至少有一个用户仍在等待。如果你混淆了预部署脚本,没有人需要等待。我拒绝帮你做这么愚蠢的事情。找一个不关心你的用户的人。我需要运行时模糊处理这很愚蠢。大多数模糊处理程序都非常慢,访问者不会在每次GET上都等待代码缩小到服务器端或客户端。如果您在客户端执行此操作,则毫无意义,因为任何人都可以打开“网络”选项卡,检查在脚本模糊化之前传递脚本的HTTP请求体。是否禁止缓存?您可以缓存运行时模糊化的脚本,但至少有一个用户仍在等待。如果你混淆了预部署脚本,没有人需要等待。我拒绝帮你做这么愚蠢的事情。找一个不关心你的用户的人。