如何在nodejs的浏览器中对http GET上的客户端js文件进行模糊处理?

时间:2014-11-28 19:09:55

标签: javascript node.js obfuscation

我在nodejs中表达了应用程序:

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文件夹中。我想在运行时自动对它们进行模糊处理,因此很难在浏览器中阅读它们。是否有可能以某种方式调整此应用程序设置?

5 个答案:

答案 0 :(得分:7)

不要在运行时进行模糊处理。创建一个构建步骤,对代码进行模糊处理,并在生产中提供模糊代码。

安装UglifyJS:

npm install -g uglify-js

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

uglifyjs < src/script.js > dist/script.js

或者,安装grunt和uglify插件:

npm install -g grunt-cli

npm install --save-dev grunt grunt-contrib-uglify

创建一个名为&#34; Gruntfile&#34;的文件。在项目的根目录中包含以下内容:

'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以混淆代码。使用index.html更新public/中的<script src="scripts.js"></script>文件,以加载模糊的连接脚本。

如果订单很重要,请按顺序列出您的脚本:

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

答案 1 :(得分:5)

因此,当用户发送到浏览器时,您实际上无法阅读您的javascript。您可以非常努力,但确定的用户将始终能够通过自动化工具和手工劳动的组合将其转换为可读的内容。

简而言之,JavaScript(或任何代码)都没有DRM。如果您想保护脚本中的知识产权,请在其上加上版权声明。如果您认为有人偷了他们,请咨询律师。

对于minify你的JavaScripts来说当然是值得的,但在我看来,混淆它们的唯一原因是因为你的愚蠢老板告诉你。

如果您想对其进行模糊处理,请查看此问题的答案: How can I obfuscate (protect) JavaScript?

请注意,混淆相当昂贵,所以你真的不想在运行时这样做。您应该在使用gruntbower等构建工具进行更改时将其应用于javascripts(我个人更喜欢grunt)。这些系统具有this之类的插件来执行混淆。

答案 2 :(得分:2)

您可以在节点应用程序中使用UglifyJs,并使用其API执行所需操作。查看他们的文档以获取更多详细信息。

来自Unglify文档的示例

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

P.S。人们注意到它是缓慢的,等等等等当然都是正确的,但是嘿,如果你在这里需要它,我就是不明白为什么在回答一个明确的问题时判断和发表意见。

答案 3 :(得分:1)

我的提示很容易被绕过,但不小心,我们可能会被困。它只是客户端的一部分,而不是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>

包括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

您可以使用以下工具:

答案 4 :(得分:1)

您可以使用命令行实用程序对代码进行模糊处理,例如:

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);
        }
    });
});