前端源码安全

今天思考下前端源码安全的东西(不是前端安全,只是针对于源码部分)。在我看来,源码安全有两点,一是防止抄袭,二是防止被攻破。实际上讲,前端的代码大多是没有什么可抄袭性,安全更是形同虚设的(任何前端输入都是不能相信的)。但如果还是想防止源码被查看,HTML、CSS并不能做什么,最终都会用露出来(最简单用Chrome开发者工具就可以看到),所以只能针对JS做文件的压缩合并和混淆。

关于抄袭

其实就前端来讲,代码没有什么好抄袭的,大多人都是抄UI设计(这个是躲不了),还有一些富前端的控件和算法,重要之处还是在于后端,而后端是抄不了的。所以前端文件压缩合并,目的并不是防止抄袭,而是为了减少文件体积、加快载入速度,提高程序的执行性能,当然压缩也有混淆的功能。文件混淆是防止其他人查看代码逻辑,但是生成的代码比原代码体积大得多,所以文件如果做了混淆,加载速度和执行速度都会有所下降。

关于安全

所有的用户输入都是不能相信的,如果后端的检查校验还做得不好,那就可能被攻破。前端代码的逻辑如果还被了解清楚,那就是雪上加霜。后端的问题我们前端管不着,前端的代码安全,简单的可以用压缩解决、再进一步就去混淆,让别人看不懂。

HTML压缩

很少有人去做HTML的压缩(特指去除空白字符和注释),根据其他资料有几个原因:

1. HTML文档中,多个空白字符等价为一个空白字符。也就是说换行等空白字符的删除是不安全的,可能导致元素的样式产生差异。

2. HTML元素中,有一个pre, 表示 preformatted text. 里面的任何空白,都不能被删除。

3. HTML中有可能有 IE 条件注释。这些条件注释是文档逻辑的一部分,不能被删除。

也是鉴于上面几个原因,不提倡压缩HTML,通过gzip压缩就已经能达到很好的效果。

CSS压缩合并

CSS压缩合并很常见,或者说是必做的,可以由后端动态生成或工具提前生成。目的也只是为了提高加载速度,CSS即便的压缩之后,代码也是清晰可见,没有混淆说法。CSS压缩合并的工具很多,一般是用sass、less直接生成压缩后的CSS,如果是直接压缩,用grunt还不错。

JS压缩合并混淆

在生产环境上,压缩合并是必做的。就如上面说的,目的不是为了防止暴露业务逻辑,是为了提高载入速度。在上一篇文章《AngularJS结合RequireJS做文件合并压缩的那些坑》,说了一点JS压缩合并要注意的东西。除了用RequireJS,直接使用grunt来做发布是不错的方式,开发后一键调用grunt。

grunt需要配置两个文件:

package.json:声明应用信息和使用依赖库的版本

{
    "name":"BingoTouch",
    "version":"3.0.0",
    "engines":{
        "node":">= 0.8.0"
    },
    "devDependencies":{
        "grunt":"~0.4.0",
        "grunt-contrib-concat":"~0.3.0",
        "grunt-contrib-copy" : "~0.4.1",
        "grunt-contrib-cssmin" : "~0.6.0",
        "grunt-contrib-uglify":"~0.2.0",
        "express":""
    }
}

Gruntfile.js:声明压缩合并的文件

module.exports = function(grunt){
     grunt.initConfig({
        pkg : grunt.file.readJSON(‘package.json‘),
        concat : {
            ‘dist/bingotouch.js‘ :
               [ ‘demo/js/ui.js‘,
                 ‘demo/js/module/ui.GarbageCollection.js‘,
                 ‘demo/js/module/ui.plugins.js‘]
        },
        uglify : {
            target : {
                files : {
                    ‘dist/bingotouch.min.js‘: ‘dist/bingotouch.js‘
                }
            }
        }
     });
    grunt.loadNpmTasks(‘grunt-contrib-concat‘);
    grunt.loadNpmTasks(‘grunt-contrib-uglify‘);
    grunt.registerTask(‘default‘, [‘concat‘,‘uglify‘]);
}

JS的混淆我到现在为止还没用过,原理都是类似的,混淆是把JS代码变成乱七八糟的字符串,然后用eval执行。

PS:uglify本身有一定的混淆作用,但也只是对变量名的混淆,混淆度并不够。

混淆前:

function hello(){
    alert(‘hello‘);
}

混淆后:

eval(function(p,a,c,k,e,r){e=String;if(!‘‘.replace(/^/,String)){while(c--)r[c]=k[c]||c;k=[function(e){return r[e]}];e=function(){return‘\\w+‘};c=1};while(c--)if(k[c])p=p.replace(new RegExp(‘\\b‘+e(c)+‘\\b‘,‘g‘),k[c]);return p}(‘1 0(){2(\‘0\‘)}‘,3,3,‘hello|function|alert‘.split(‘|‘),0,{})) 

不同混淆算法混淆的结果不一样,而且混淆后也不是一劳永逸,还是可以被反混淆的。另外混淆会降低程序执行性能,所以是否需要做混淆得做评估。

总结

我觉得做好文件压缩合并,简单的变量名混淆就可以了,并不需要那么彻底的混淆。即便是前端被人挖得清清楚楚,只要后端强劲也就没问题了。所以当你想进行代码混淆时候,想想是为了什么,值不值得。

本文为原创文章,转载请保留原出处,方便溯源,如有错误地方,谢谢指正。

本文地址 :http://www.cnblogs.com/lovesong/p/5185543.html

时间: 2024-10-20 16:31:47

前端源码安全的相关文章

钉钉(工作协同)应用之前端源码赏析

这几天在兴趣下翻看了钉钉(工作协同)应用的前端源码,分析其目录结构.构建工具及框架使用等,进行前端技术研究,分享我的总结成果. PS:不知道这应用的没关系,因为总结出来是前端通用的东西. PS:其应用样子. 前言 我研究的是PC桌面版的钉钉应用,应用是由“chrome内核容器+ web页面”构成的,也就是桌面的混合应用(跟手机Hybrid应用的原理一样),针对分析的也是其web页面部分. 首先它是一个单页面的应用,主体框架是用AngularJS,页面路由也是由AngularJS完成.由于框架是会

前端源码-部分资源

然后下面链接分享一下,是目前阅读研究源码的一部分资源:jQuery source viewerjquery源码查询这些年.我收集的JQuery代码jquery1.6中的.prop()和.attr()异同第三章<遍历DOM元素>jquery选择器javascript笔记:临摹jQuery(一)jQuery 的原型关系图jquery选择器[原创]jQuery1.8.2源码解析之jQuery.Callbacks[原创] jQuery1.6.1源码分析系列(停止更新)jQuery event(上)jq

10款精美的web前端源码的特效

1.HTML5侧滑聊天面板 很酷的聊天界面 这是一款基于HTML5和SVG的侧滑聊天面板,初始化的时候聊天面板是锁定的,当你拖动白色区域时,即可解锁展开聊天面板,显示所有好友.点击面板中的好友即可切换到聊天模式.无论界面美化还是动画特效,这款HTML5聊天面板都非常不错,当然具体的聊天功能仍需你自己实现. 在线演示 源码下载 2.jQuery 美化界面的下拉框 之前我们介绍过一款基于jQuery多级联动美化版Select下拉框,很多朋友都非常喜欢,可见经过美化过的下拉框的确可以让你的网页更为精妙

10款基于JQuery实现的web前端源码预览

1.优秀的响应式 jQuery 滑块插件 iView Slider 是一款优秀的 jQuery 滑动插件,用于实现文本.图片.视频等各种网页内容的滑动功能.iView Slider 支持响应式布局,能够很好的运行于触屏设备中.iView Slider 内置35种很炫的过渡效果(Transition Effects),能够帮助你制作出各种各样的滑动效果.iView Slider 提供了三种不同形式的加载进度条形式,以生动直观的方式告诉用户下一个滑块还有多久时间加载.iView Slider 依赖于

微信小程序前端源码逻辑和工作流

看完微信小程序的前端代码真的让我热血沸腾啊,代码逻辑和设计一目了然,没有多余的东西,真的是大道至简. 废话不多说,直接分析前端代码.个人观点,难免有疏漏,仅供参考. 文件基本结构: 先看入口app.js,app(obj)注册一个小程序.接受一个 object 参数,其指定小程序的生命周期函数等.其他文件可以通过全局方法getApp()获取app实例,进而直接调用它的属性或方法,例如(getApp().globalData) //app.js App({ onLaunch: function ()

前端工程师开发APICloud应用源码集锦

现在APICloud开发者众多,各位前端开发者也可以利用自己擅长的技术来开发属于自己的APP,很多人会问,如何开发,下面就整理出来十款分享出来的源码给大家参考和学习: 仿QQ电影票源码 web前端开发者的尝试,仿炫酷的QQ电影票前端源码 http://community.apicloud.com/bbs/forum.php?mod=viewthread&tid=502 仿大众点评APP源码 测试apicloud的跨平台能力,仿大众点评APP前端源码 http://community.apiclo

高仿QQ源码下载 (android前端+JAVA后台+spark&lt;windows版聊天&gt;)方便集成到自己系统

 A openfire (XMPP+开源源码); B android前端源码(仿QQ高大上UI); C JAVA后台源码(UI高大上HTML5);  Dspark(windows版);  系统主要实现为:JAVA后台(springmvc+mybaits)+openfire(xmpp推送)+android(asmark+ActiveAndroid+async-http+universal-image-loader)+spark(windows版);  android前端 1.集成Activie

九千套前端模板及源码

以前会接到不少给小型企业建站的SH,然后花了不少时间和精力收集.购买了数千套前端源码.下面我将这些模板开源以回馈大家对我的支持.库里有关于旅游.美食.汽车等各种行业网站的适用模板,我之前做过一套二手房交易市场商城,使用tornado写的全栈项目,代码注释非常完整,感兴趣的可以去github仓库看看!以后也可以带大家做一套像下面这样的电子商城 行了,剩下的你们自己下载看看吧! 以后除了分享实用工具外,也会陆陆续续的领着大家开发全栈项目,已经设计好了几个实用工具.一起加油吧! 关注公众号并回复:前端

browserify压缩合并源码反编译

最近在学习钉钉(一个协作应用)桌面应用的前端源码时候,发现其js源码是用browserify做模块开发.于是想还原其源码的原本的目录结构,学习它的目录分类以及业务划分. 前言 用过browserify构建工具的应该清楚,在压缩合并后的代码的最前面,有处理模块依赖关系的代码: function e(t, n, r) { function s(o, u) { if (!n[o]) { if (!t[o]) { var a = typeof require == "function" &am