[asp.net mvc 奇淫巧技] 05 - 扩展ScriptBundle,支持混淆加密javascript
一、需求:
在web开发中,经常会处理javascript的一些问题,其中就包括js的压缩,合并,发布版本以及混淆加密等等问题。在asp.net 开发中我们使用ScriptBundle已经可以解决javascript遇到的大部分问题,其中包括合并压缩发布版本的问题。
关于ScriptBundle的简单应用,可以参考
官方文档 Bundling and Minification
asp.net 自带的ScriptBundle已经包含了大部分功能,但是无法实现javascript的混淆加密。在实际项目中,确实很多时候并不希望客户直接很容易的查看到javascript的源码,之前的做法都是把javascript的代码复制到混淆加密的网站,然后进行混淆加密再复制粘贴到项目中。这样做的效率及其低下,并且很容易出现不可预知的问题。
经常使用javascript混淆加密网站
http://tool.chinaz.com/js.aspx
http://www.sojson.com/jscodeconfusion.html
既然asp.net ScriptBundle已经为我们做了那么多对javascript的操作优化,可不可扩展ScriptBundle加一部混淆加密呢。答案是肯定的。
二、寻找 ScriptBundle 扩展点
首先用ilspy查找源码,找寻扩展点,第一步打开System.Web.Optimization的dll,然后查询ScriptBundle。

在反编译ScriptBundle的类中,发现了一些关键信息(JsMinify),那就是说自定义一个类CustomScriptBundle继承Bundle,然后在构造函数中传入实现IBundleTransform接口的自定义混淆加密js的类CustomJsMinify。
这句话听起来有点绕口,简单点就是
1、新建一个类CustomScriptBundle继承Bundle
public class CustomScriptBundle : Bundle
{
public CustomScriptBundle(string virtualPath) : this(virtualPath, null)
{
} public CustomScriptBundle(string virtualPath, string cdnPath) : base(virtualPath, cdnPath, new IBundleTransform[]
{
new CustomJsMinify()
})
{
base.ConcatenationToken = ";";
}
}
2、新建一个类CustomJsMinify实现IBundleTransform接口并实现方法Process
我们需要处理的javascript的源码就在Process方法中,在这里我们就可以对javascript源码进行压缩,混淆加密,或者加上copyright都可以。
下面的代码对每个javascript文件加上简单的copyright。
public class CustomJsMinify : IBundleTransform
{
public void Process(BundleContext context, BundleResponse response)
{
if (context == null)
{
throw new ArgumentNullException("context");
}
if (response == null)
{
throw new ArgumentNullException("response");
}
if (!context.EnableInstrumentation)
{
try
{
response.Content = "/*\r\nAuthor:Emrys\r\nVerson:1.1\r\n*/\r\n" + response.Content;
}
catch (Exception ex)
{
response.Content = "/*\r\nError:" + ex.Message + "\r\n*/\r\n" + response.Content;
}
}
response.ContentType = "text/javascript";
}
}
3、在BundleConfig中配置javascript时用CustomScriptBundle
bundles.Add(new CustomScriptBundle("~/bundles/layout").Include(
"~/Scripts/layout.js"
));
4、在cshtml中引入方式不变
@Scripts.Render("~/bundles/layout")
运行项目得到的结果是

在javascript代码开始处,加上了我们自定义的文字。
在运行项目时,记得把项目web.config中的debug改为false,因为默认情况下,debug模式javascript代码是不做处理的,因为debug状态下如果进行压缩合并或者混淆加密的话,那程序员就很难调试js代码了。
5、总结
新建一个类实现IBundleTransform接口并实现方法Process,在方法Process中做你需要的处理即可。
三、寻找C#混淆加密javascript的代码或API
我们已经知道怎么扩展ScriptBundle了,那现在要做的就是找到合理混淆加密javascript的C#代码或者API即可。
1、http://dean.edwards.name/download/#packer 可以实现js的混淆加密,开源免费
2、http://www.javascriptobfuscator.com/ 国外的一个混淆加密网站,高级功能需要收费
3、https://github.com/aemkei/jsfuck 一个可以把javascript代码转成[]()!+字符
4、https://github.com/mishoo/UglifyJS2
小伙伴们可以根据需求选择不同的方式,一般第一种就可以。 如果需要特殊加密。可以使用第二种。
我们以第一个为例子
首先现在下载代码,然后按照上面的方式,最后实现Process方法处理javascript
public class CustomJsMinify : IBundleTransform
{
public void Process(BundleContext context, BundleResponse response)
{
if (context == null)
{
throw new ArgumentNullException("context");
}
if (response == null)
{
throw new ArgumentNullException("response");
}
if (!context.EnableInstrumentation)
{
try
{
ECMAScriptPacker p = new ECMAScriptPacker(ECMAScriptPacker.PackerEncoding.Normal, true, true);
response.Content = p.Pack(response.Content);
}
catch (Exception ex)
{
response.Content = "/*\r\nError:" + ex.Message + "\r\n*/\r\n" + response.Content;
}
}
response.ContentType = "text/javascript";
}
}
得到的javascript结果为:

四、总结
我们通过扩展ScriptBundle就可以很容易的对网站的javascript代码进行混淆加密,保护了javascript代码。
我们可以有很多种方式对javascript进行混淆加密,压缩等等操作,比如通过实现IHttpModule,也可以实现对javascript的操作。
通过扩展ScriptBundle的优点
1、可以继续使用ScriptBundle的压缩,合并和版本控制功能,只是在这些功能上进一步增加了混淆加密的功能。
2、不需要每次发布时粘贴复制至加密的网站,现在可以全部显示自动化加密。
3、使用优秀的加密SDK,可以更高的保护javascript源码。
4、可以随意在javascript上进行操作,比如增加copyright版本号等。
github:https://github.com/Emrys5/Asp.MVC-05-Extended-ScriptsBundle/tree/master
oschina:http://git.oschina.net/emrys5/Asp.MVC-05-Extended-ScriptsBundle
本文原创,欢迎拍砖和推荐。
系列课程
- [asp.net mvc 奇淫巧技] 01 - 封装上下文 - 在View中获取自定义的上下文
- [asp.net mvc 奇淫巧技] 02 - 巧用Razor引擎在Action内生成Html代码
- [asp.net mvc 奇淫巧技] 03 - 枚举特性扩展解决枚举命名问题和支持HtmlHelper
- [asp.net mvc 奇淫巧技] 04 - 你真的会用Action的模型绑定吗?
- [asp.net mvc 奇淫巧技] 05 - 扩展ScriptBundle,支持混淆加密javascript
- [asp.net mvc 奇淫巧技] 06 - 也许你的项目同一个用户的请求都是同步的
[asp.net mvc 奇淫巧技] 05 - 扩展ScriptBundle,支持混淆加密javascript的更多相关文章
- [asp.net mvc 奇淫巧技] 03 - 枚举特性扩展解决枚举命名问题和支持HtmlHelper
一.需求 我们在开发中经常会遇到一些枚举,而且这些枚举类型可能会在表单中的下拉中,或者单选按钮中会用到等. 这样用是没问题的,但是用过的人都知道一个问题,就是枚举的命名问题,当然有很多人枚举直接中文命 ...
- [asp.net mvc 奇淫巧技] 01 - 封装上下文 - 在View中获取自定义的上下文
我们在asp.net 开发中已经封装了最强大的HttpContext,我们可以在HttpContext中可以获取到几乎任何想获取的东西,也可以在HttpContext写入需要返回客户端的信息.但是这些 ...
- [asp.net mvc 奇淫巧技] 02 - 巧用Razor引擎在Action内生成Html代码
在web开发中经常会遇到在内部代码中获取Html,这些Html是需要和数据进行一起渲染.并不是直接把Html代码返回给客户端.这样的做法有很多应用场景,例如分页.Ajax一次性获取几段Html片段.生 ...
- [asp.net mvc 奇淫巧技] 04 - 你真的会用Action的模型绑定吗?
在QQ群或者一些程序的交流平台,经常会有人问:我怎么传一个数组在Action中接收.我传的数组为什么Action的model中接收不到.或者我在ajax的data中设置了一些数组,为什么后台还是接收不 ...
- [asp.net mvc 奇淫巧技] 06 - 也许你的项目同一个用户的请求都是同步的
一.感慨 很久前看到一篇博客中有句话大致的意思是:“asp.net 程序性能低下的主要原因是开发人员技术参差不齐”,当时看到这句话不以为然,然而时间过的越久接触的.net 开发人员越多就越认同这句话: ...
- 扩展ScriptBundle,支持混淆加密javascript
一.需求: 在web开发中,经常会处理javascript的一些问题,其中就包括js的压缩,合并,发布版本以及混淆加密等等问题.在asp.net 开发中我们使用ScriptBundle已经可以解决ja ...
- ASP.NET Core 奇淫技巧之伪属性注入
一.前言 开局先唠嗑一下,许久未曾更新博客,一直在调整自己的状态,去年是我的本命年,或许是应验了本命年的多灾多难,过得十分不顺,不论是生活上还是工作上.还好当我度过了所谓的本命年后,许多事情都在慢慢变 ...
- Asp.net Mvc模块化开发之分区扩展框架
对于一个企业级项目开发,模块化是非常重要的. 默认Mvc框架的AreaRegistration对模块化开发真的支持很好吗?真的有很多复杂系统在使用默认的分区开发的吗?我相信大部分asp.net的技术团 ...
- [javascript 实践篇]——那些你不知道的“奇淫巧技”
1. 空(null, undefined)验证 刚开始,我是比较蠢的验证(我还真是这样子验证的) if (variable1 !== null || variable1 !== undefined | ...
随机推荐
- JavaScript中return的用法详解
JavaScript中return的用法详解 最近,跟身边学前端的朋友了解,有很多人对函数中的this的用法和指向问题比较模糊,这里写一篇博客跟大家一起探讨一下this的用法和指向性问题. 1定义 t ...
- JS中判断数组的方法
JavaScript中检测对象的方法 1.typeof操作符 这种方法对于一些常用的类型来说那算是毫无压力,比如Function.String.Number.Undefined等,但是要是检测Arra ...
- Java之【线程通信】--标志位练习
* 写两个线程,一个线程打印1-52,另一个线程答应字母A-Z. * 打印顺序为12A34B56C--5152Z.通过使用线程之间的通信协调关系. 注:分别给两个对象构造一个对象o,数字每打印两个或字 ...
- python对mysql数据库操作的三种不同方式
首先要说一下,在这个暑期如果没有什么特殊情况,我打算用python尝试写一个考试系统,希望能在下学期的python课程实际使用,并且尽量在此之前把用到的相关技术都以分篇博客的方式分享出来,有想要交流的 ...
- a标签点击之后有个虚线边框,怎么去掉
1.行内处理方式1 <a hidefocus="true" href="#"></a> 2.行内处理方式2,让a标签获得焦点就失去焦点, ...
- map,zip,reduce函数
lt=range(5,10) lw=range(8,13) def mul(a,b): return a*b def mul_list(param1,param2): return_list=[] f ...
- vue-cli创建自己的项目
vue-cli 是一个官方发布 vue.js 项目脚手架,使用 vue-cli 可以快速创建 vue 项目,GitHub地址是:https://github.com/vuejs/vue-cli 一. ...
- Android 创建虚拟机时“提示no system images installed for this target”
经上网查证,发现原因在于CPU/ABI选项无法选择,并显示“No system images installed for this target”,也就是没有适合的系统镜像,通过与安装好了的ADT-b ...
- Ubuntu16.04 + caffe-ssd + [CPU_ONLY] + KITTI 训练总结
本次训练主要参考:http://blog.csdn.net/jesse_mx/article/details/65634482 感谢 Jesse_Mx ,帮助了我很多. 坑一[openCV未安装成功] ...
- ASP.NET Core 源码学习之 Options[2]:IOptions
在上一篇中,介绍了一下Options的注册,而使用时只需要注入IOption即可: public ValuesController(IOptions<MyOptions> options) ...