• 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

  • 相关阅读:
    iOS多线程_06_GCD其它用法
    iOS多线程_05_线程间通信NSThread/GCD
    iOS多线程_04_GCD
    iOS多线程_03_Block
    iOS多线程_02_多线程的安全问题
    iOS多线程_01_简介和NSThread
    shell 根据端口号输出所有的pid
    【java核心36讲】接口和抽象类的区别
    CSS布局
    CSS基础
  • 原文地址:https://www.cnblogs.com/walls/p/6270738.html
Copyright © 2020-2023  润新知