全部 android asp.net C/C++ cshap IOS Java javascript nodejs perl php python ruby web容器 其他 前端 数据库 第三方平台 混合式APP 网络 系统 默认分类

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

0 69

一、官方文档的说明

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)源代码

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

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

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

三、含有eval代码测试

1)源代码

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

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

javascript">javascript">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)源代码

javascript">javascript">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)压缩后重新格式化的代码

javascript">javascript">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"]进行调用

javascript">javascript">  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

热忱回答0

  • 加入年费大会员(20每年)
  • 热门标签

    猜你喜欢

    1. JDFS:一款分布式文件管理实用程序第一篇(线程池、epoll、上传、下载)
    2. Alamofire源码解读系列(十二)之请求(Request)
    3. margin塌陷(父子元素塌陷)
    4. PowerDesigner建模应用(一)逆向工程,配置数据源并导出PDM文件
    5. 一个全局变量引起的DLL崩溃
    6. 【吉光片羽】短信验证
    7. 浅谈系统服务分发
    8. UWP Composition API - New FlexGrid 锁定行列
    9. 极简单之爬虫入门
    10. 开源框架是如何通过JMX来做监控的(一) - JMX简介和Standard MBean

    衣食父母

    最近热帖

    1. 走进JavaScript——重拾对象 6
    2. 最近用django做了个在线数据分析小网站 6
    3. mysql之 mysqldump 备份恢复详解 7
    4. 深入理解Java常用类-----时间日期 7
    5. css重构之旅 8
    6. 分布式队列ZooKeeper的实现 6
    7. Java-面向对象总结 7
    8. 《HelloGitHub》第 14 期 8
    9. 压缩'语料库,即提取特征词或词频,做量化处理之后以“列向量”形式保存到数据库 8
    10. 【charger battery 充電 充電器 電池】過充保護警告訊息 over charging protection,Battery over voltage protection, warning message 7

    随机文章

    1. openstack i版搭建教程
    2. Kafka: Consumer
    3. iOS 原生的 UIButton 点击事件是不允许带多参数的,唯一的一个参数就是默认UIButton本身 那么我们该怎么实现传递多个参数的点击事件呢?
    4. [原]CentOS7.2部署node-mapnik
    5. for与break的用法