【前端】前端网络安全
今天思考下前端源码安全的东西(不是前端安全,只是针对于源码部分)。在我看来,源码安全有两点,一是防止抄袭,二是防止被攻破。实际上讲,前端的代码大多是没有什么可抄袭性,安全更是形同虚设的(任何前端输入都是不能相信的)。但如果还是想防止源码被查看,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,{}))
不同混淆算法混淆的结果不一样,而且混淆后也不是一劳永逸,还是可以被反混淆的。另外混淆会降低程序执行性能,所以是否需要做混淆得做评估。
总结
我觉得做好文件压缩合并,简单的变量名混淆就可以了,并不需要那么彻底的混淆。即便是前端被人挖得清清楚楚,只要后端强劲也就没问题了。所以当你想进行代码混淆时候,想想是为了什么,值不值得。
另外我们有时可能会做一些富前端的外包,那我们在交付之前可以对前端脚本进行加密,供演示使用。
1. 在代码里面设置一个代码过期时间,过期后代码就无法使用了。
2. 对js进行压缩混淆。
猜你喜欢
- 【前端】Nodejs基于Windows安装教程
- 一、安装环境在进行 Node.js 环境的安装之前,您需要先安装并配置好以下环境:操作系统:Windows命令行工具:Node.js 是通过命令行工具进行使用和管理的,因此您需要选择一个适合您的命令行工具。在 Windows 上,您可以选择使用命令提示符(cmd)或 PowerShell。文本编辑器:Node.js 应用程序通常是使用文本编辑器编写的,因此您需要选择一个适合您的文本编辑器。常用的文本编辑器包括 Visual Studio Code、Sublime Text、Atom 等。网络连接
- 【前端】html Antv L7 + mapbox 实现3D地图 3D中国地图 不限于中国地图
- echarts的3D地图实在太丑了,还一堆bug使用阿里的Antv可视化库L7,实现3D地图,底图是mapbox 参考示例:https://l7.antv.antgroup.com/zh/examples/polygon/3d#floatMap如果不需要底图样式,可把Scene的style设置为blank 直接上代码了,vue的就不说了,项目是html的mapbox依赖<script src='https://api.mapbox.com/mapbox-gl-js/v2.
- 【前端】PHP开发者的Vue与React入门指南
- PHP是一种常用的服务器端脚本语言,用于开发动态网页和网站。许多PHP开发者经常需要学习前端框架来提升他们的技能,并且Vue.js和React.js是两个当前非常热门的前端框架。本文将为PHP开发者提供一份Vue.js和React.js的入门指南,带有具体的代码示例,帮助他们快速了解这两个框架的基本概念和用法。1. Vue.js入门指南Vue.js是一款轻量级的JavaScript框架,用于构建交互式的用户界面。下面是一个简单的Vue.js示例,展示了如何创建一个基本的Vue组件并进行数据绑定:
- 【HTML】html使用高德地图设置考勤范围
- 需求:系统需要考勤功能,并在WEB端设置考勤范围,用于员工手机端再次范围内打卡签到,WEB端需要设置考勤地点以及考勤范围。1 使用高德地图开发首先需要再高德开放平台注册账号,并创建应用,获取高德地图key以及安全秘钥这里需要用到地图定位,一级地理坐标转换,使用高德开放平台JSAPI开发。HTML引入js,安全秘钥配置一定要写在js上方:<script> window._AMapSecurityConfig = { &
- 【HTML】必应地图BingMaps的使用
- 又换新地图了,之前换了箩筐地图,效果不能满足实际需要,这次换成了必应地图BingMaps,同样实现设置考勤区域的功能,效果还是挺不错的。相关阅读【HTML】html使用高德地图设置考勤范围 【HTML】箩筐地图的使用,设置考勤范围一、 获取应用KEY还是老样子,先注册账号,然后获取key。注册参考官方说明https://www.bingmap.cn/guide/db765008-dafe-11e8-a995-d46d6d978bfa?module=doc,这里不再过多说明。
- 【前端】Ant Design of Vue安装
- 关于 ant-design-vue #众所周知,Ant Design 作为一门设计语言面世,经历过多年的迭代和积累,它对 UI 的设计思想已经成为一套事实标准,受到众多前端开发者及企业的追捧和喜爱,也是 React 开发者手中的神兵利器。希望 ant-design-vue 能够让 Vue 开发者也享受到 Ant Design 的优秀设计。ant-design-vue 是 Ant Design 的 Vue 实现,组件的风格与 Ant Design 保持同步,组件的 html 结构和 cs
- 【前端】快速了解 ES6 新增字符串方法,开箱即用(含案例)
- 文章目录📋前言🎯includes() 方法🎯startsWith() 方法🎯endsWith() 方法🎯repeat() 方法🎯padStart() 方法🎯padEnd() 方法🎯trim() 方法🎯trimStart() 或 trimLeft() 方法🎯trimEnd() 或 trimRight() 方法🎯replaceAll() 方法🎯slice() 方法🎯substring() 方法🎯split() 方法🎯charAt() 方法🎯charCodeAt() 方