zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    190. Reverse Bits
    150. Evaluate Reverse Polish Notation
    【UML】状态图与活动图
    【UML】类图与对象图
    【UML】用例图
    【运维】Dell R710如何开启VT服务
    【运维】Dell R710如何做Raid0与Raid5
    【运维】略谈Raid级别
    【VMware vSphere】VMware vSphere简单了解
    【Linux】在Linux上安装VNC
  • 原文地址:https://www.cnblogs.com/walls/p/6270738.html
Copyright © 2011-2022 走看看