• YUI Compressor压缩失效的场景-eval和with


    一、官方文档的说明

    in the face of evil features such as eval or with, the YUI Compressor takes a defensive approach by not obfuscating any of the scopes containing the evil statement

    传送门:官方文档
    翻译成中文就是说:eval和with语句所处的作用域,YUI Compressor是不进行压缩混淆单词的。

    二、普通代码测试

    1)源代码

    function testCompressor(){
    	// 测试YUI Compressor
    	var person = {
    			'name':'wall',
    			'jser':true
    		};
    		
    	console.log("my name is "+ person.name);
    }
    

    2)压缩后重新格式化的代码

    function testCompressor() {
        var a = {
            name: "wall",
            jser: true
        };
        console.log("my name is " + a.name)
    };
    

    三、含有eval代码测试

    1)源代码

    function testCompressor(){
    	// 测试YUI Compressor
    	var person = {
    			'name':'wall',
    			'jser':true
    		};
    		
    	console.log("my name is "+ person.name);
    	eval("console.log("I am Jser");");
    }
    

    2)压缩后重新格式化的代码

    function testCompressor() {
        var person = {
            name: "wall",
            jser: true
        };
        console.log("my name is " + person.name);
        eval('console.log("I am Jser");')
    }
    

    结论:只要eval存在的作用域,代码都无法做混淆操作。

    四、解决方案

    既然无法改变这个规则,那就要尽量去避免代码中直接出现eval。可以讲eval封装起来调用。
    1)源代码

    function testCompressor(){
    	// 测试YUI Compressor
    	var person = {
    			'name':'wall',
    			'jser':true
    		};
    		
    	console.log("my name is "+ person.name);
    	myEval("console.log("I am Jser");");
    }
    
    function myEval(data){
    	return eval(data);
    }
    

    2)压缩后重新格式化的代码

    function testCompressor() {
        var a = {
            name: "wall",
            jser: true
        };
        console.log("my name is " + a.name);
        myEval('console.log("I am Jser");')
    }
    function myEval(data) {
        return eval(data)
    }
    

    3)另一种解决方式: 改为window["eval"]进行调用

      function testCompressor(){
    	// 测试YUI Compressor
    	var person = {
    			'name':'wall',
    			'jser':true
    		};
    		
    	console.log("my name is "+ person.name);
    	window["eval"]("console.log("I am Jser");");
    }
    

    with 也适用上述的解决方案

    原文入口:http://www.jianshu.com/p/67973651e398

  • 相关阅读:
    docker容器跑tomcat遇到的坑
    PCL 编程多个点云合成
    PCL 常用小知识
    PCL点云库中的坐标系(CoordinateSystem)
    Ubuntu14.04(64位)下gcc-linaro-arm-linux-gnueabihf交叉编译环境搭建
    Windows cmd 快捷操作
    #Pragma Pack与内存分配
    线段上的整数点个数
    基于PCL绘制模型并渲染
    rosbag数据记录及转换图片、视频
  • 原文地址:https://www.cnblogs.com/walls/p/6270738.html
Copyright © 2020-2023  润新知