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

  • 相关阅读:
    js中连续赋值
    PHP文件上传漏洞原理以及如何防御详解 【转】
    奇虎360PHP工程师2019年面试题和答案解析【转】
    学习ES6碰到的单词
    Proxy(代理)例子
    for of 迭代器 生成器 数组的一些杂乱记录
    async和await
    Promise.call
    ES6中Promise.race
    Promise 和.then
  • 原文地址:https://www.cnblogs.com/walls/p/6270738.html
Copyright © 2011-2022 走看看