首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >丑陋的javascript代码和grunt-cont肋骨-uglify

丑陋的javascript代码和grunt-cont肋骨-uglify
EN

Stack Overflow用户
提问于 2017-05-15 02:17:18
回答 1查看 958关注 0票数 1

我有以下文件:package.json

代码语言:javascript
复制
{
  "name": "uglify",
  "devDependencies": {
    "grunt": "^1.0.1",
    "grunt-contrib-uglify": "^3.0.0"
  }
}

还有以下文件:Gruntfile.js

代码语言:javascript
复制
module.exports = function(grunt) {
    grunt.initConfig({
        uglify: {
            options: {
                beautify: true,
                mangle: {
                    properties: true
                }
            },
            log_sum_9: {
                src: 'log_sum_9.js',
                dest: 'log_sum_9.min.js'
            }
        }
    });
    grunt.loadNpmTasks('grunt-contrib-uglify');

    grunt.registerTask('log_sum_9', ['uglify:log_sum_9']);
}

还有以下文件:log_sum_9.js

代码语言:javascript
复制
(function() {
    var
        sum = "2+3+4",
        calc = function(operation) {
            return eval(operation);
        }
    ;
    console.log(calc(sum));
})();

那我就做:

要安装所需的NodeJS模块,请执行以下操作:

代码语言:javascript
复制
$ npm install

丑化log_sum_9.js

代码语言:javascript
复制
$ grunt log_sum_9

然后我得到一个丑陋的文件:log_sum_9.min.js

代码语言:javascript
复制
!function() {
    var sum = "2+3+4", calc = function(operation) {
        return eval(operation);
    };
    console.log(calc("2+3+4"));
}();

这两个脚本都正常工作:

代码语言:javascript
复制
$ node log_sum_9.js
9

$ node log_sum_9.min.js
9

我的问题是,丑陋的文件log_sum_9.min.js没有更改变量的名称:sumcalcoperation (所有这些变量都是局部变量)。

如果文件log_sum_9.js的内容是在以下在线混淆器上引入的:https://www.javascriptobfuscator.com/Javascript-Obfuscator.aspx

然后得到以下代码:

代码语言:javascript
复制
var _0x257f = ["\x32\x2B\x33\x2B\x34", "\x6C\x6F\x67"];
(function() {
    var _0xb897x1 = _0x257f[0],
        _0xb897x2 = function(_0xb897x3) {
            return eval(_0xb897x3)
        };
    console[_0x257f[1]](_0xb897x2(_0xb897x1))
})()

如您所见,前面的3个变量:sumcalcoperation已经更改了它们的名称。

如果将上述代码放在文件:log_sum_9.online.js上,则可以执行以下操作:

代码语言:javascript
复制
$ node log_sum_9.online.js
9

(它也正常工作)

我的问题是:

如何配置文件:Gruntfile.js,以使前面的3个变量被混淆?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-05-15 09:08:49

格罗特-接触-丑陋 (据我所知)并不提供与您在帖子中链接的在线工具相同的混淆级别--它似乎使用JavaScript十六进制逃逸代码/序列对字符串进行编码。

但是,格罗特-接触-丑陋使用丑js来提供破烂名称的选项。可以将topleveleval属性的eval值设置为true

Gruntfile.js

您的options任务中的uglify可以设置如下:

代码语言:javascript
复制
// ...
options: {
    beautify: true,
    mangle: {
        properties: true,
        toplevel: true, // <-- Add this
        eval: true  // <-- Add this
    }
},
// ...

注意:当名字乱七八糟时,您需要勤奋地确保您的代码仍然按预期工作。可能有一些您不想被破坏的名称(例如,jQuery是一个非常常见的名称)。uglify-js文档的摘录如下:

当启用mangling但要防止某些名称损坏时,可以使用--mangle reserved声明这些名称-传递逗号分隔的名称列表.

为了避免某些名称在uglify任务中损坏,您可以使用reserved属性提供一个名称数组:

,例如

以下配置破坏了所有名称(不包括operationjQuery )

代码语言:javascript
复制
// ...
options: {
    beautify: true,
    mangle: {
        properties: true,
        toplevel: true,
        eval: true,
        reserved: ['operation', 'jQuery'] // Exclude mangling specific names.
    }
},
// ...
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43970696

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档