下载地址
本人使用quickui-free_4.0.6版本 下载地址如下点击打开链接
开发背景
最近在看前端框架,偶然发现quick ui 框架不错,虽然渲染不如bootstrap, 但是对ie的兼容性不错。话不多说,根据文档 访问框架首页发现有个讨厌的水印:
调试发现有个未知的代码块如下:
查询了整个工程也没找到id 为这个的代码,经过一系列跟踪发现他与cn.js这个有关,查询官网发现这是他们的授权文件,(都免费版干嘛要授权,吐槽一下),废话不多说,经过调试发现代码是这里生成的:
我解析了一下这三个eval 大概如下:
-
var quiLangage = {
-
quiGrid: {
-
errorMessage:
“发生错误”,
-
pageStatMessage:
“显示从{from}到{to},总 {total} 条 。每页显示:{pagesize}”,
-
pageTextMessage:
“Page”,
-
loadingMessage:
“加载中…”,
-
findTextMessage:
“查找”,
-
noRecordMessage:
“没有符合条件的记录存在”,
-
isContinueByDataChanged:
“数据已经改变,如果继续将丢失数据,是否继续?”,
-
saveMessage:
“保存”,
-
applyMessage:
“应用”,
-
cancelMessage:
“取消”,
-
draggingMessage:
“{count}行”,
-
editorPromptMessage:
“请选择”
-
},
-
select: {
-
promptMessage:
“请选择”,
-
noItemMessage:
“无内容”,
-
loadingMessage:
“数据加载中…”,
-
paramErrorMessage:
“单选下拉框参数格式有误!(提示:json数据的属性和名称必须以双引号包围)”,
-
dataErrorMessage:
“单选下拉框data属性设置的数据格式有误!(提示:放在标签中的json数据的属性和名称必须以双引号包围)”,
-
urlErrorMessage:
“单选下拉框数据源出错,请检查url路径”,
-
ldError:
“无内容”
-
}
-
};
-
$(<span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>) </span>{</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="27"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> qflag();</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="28"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> });</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="29"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">qflag</span>(<span class="hljs-params"></span>) </span>{</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="30"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-keyword">var</span> a = <span class="hljs-number">0</span>;</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="31"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-keyword">var</span> b = <span class="hljs-number">0</span>;</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="32"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-keyword">var</span> now = <span class="hljs-keyword">new</span> <span class="hljs-built_in">Date</span>();</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="33"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-keyword">var</span> year = now.getFullYear();</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="34"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-keyword">var</span> month = now.getMonth() + <span class="hljs-number">1</span>;</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="35"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-keyword">var</span> day = now.getDate();</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="36"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-keyword">var</span> beginTime = year + <span class="hljs-string">"-"</span> + month + <span class="hljs-string">"-"</span> + day;</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="37"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-keyword">var</span> endTime = <span class="hljs-string">"2017-5-1"</span>;</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="38"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-keyword">var</span> deadTime = <span class="hljs-string">"2019-5-1"</span>;</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="39"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-keyword">var</span> beginTimes = beginTime.substring(<span class="hljs-number">0</span>, <span class="hljs-number">10</span>).split(<span class="hljs-string">"-"</span>);</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="40"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-keyword">var</span> endTimes = endTime.substring(<span class="hljs-number">0</span>, <span class="hljs-number">10</span>).split(<span class="hljs-string">"-"</span>);</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="41"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-keyword">var</span> deadTimes = deadTime.substring(<span class="hljs-number">0</span>, <span class="hljs-number">10</span>).split(<span class="hljs-string">"-"</span>);</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="42"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> beginTime = beginTimes[<span class="hljs-number">1</span>] + <span class="hljs-string">"/"</span> + beginTimes[<span class="hljs-number">2</span>] + <span class="hljs-string">"/"</span> + beginTimes[<span class="hljs-number">0</span>] + <span class="hljs-string">" "</span> + beginTime.substring(<span class="hljs-number">10</span>, <span class="hljs-number">19</span>);</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="43"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> endTime = endTimes[<span class="hljs-number">1</span>] + <span class="hljs-string">"/"</span> + endTimes[<span class="hljs-number">2</span>] + <span class="hljs-string">"/"</span> + endTimes[<span class="hljs-number">0</span>] + <span class="hljs-string">" "</span> + endTime.substring(<span class="hljs-number">10</span>, <span class="hljs-number">19</span>);</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="44"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> deadTime = deadTimes[<span class="hljs-number">1</span>] + <span class="hljs-string">"/"</span> + deadTimes[<span class="hljs-number">2</span>] + <span class="hljs-string">"/"</span> + deadTimes[<span class="hljs-number">0</span>] + <span class="hljs-string">" "</span> + deadTime.substring(<span class="hljs-number">10</span>, <span class="hljs-number">19</span>);</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="45"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> a = (<span class="hljs-built_in">Date</span>.parse(endTime) - <span class="hljs-built_in">Date</span>.parse(beginTime)) / <span class="hljs-number">3600</span> / <span class="hljs-number">1000</span>;</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="46"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> b = (<span class="hljs-built_in">Date</span>.parse(deadTime) - <span class="hljs-built_in">Date</span>.parse(beginTime)) / <span class="hljs-number">3600</span> / <span class="hljs-number">1000</span>;</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="47"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-keyword">if</span> (a > <span class="hljs-number">0</span> || a == <span class="hljs-number">0</span>) {</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="48"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-keyword">return</span> <span class="hljs-literal">true</span>;</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="49"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> } <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (a < <span class="hljs-number">0</span> && b > <span class="hljs-number">0</span>) {</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="50"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-keyword">if</span> (top.document.getElementById(<span class="hljs-string">"copyrightinfo"</span>)) {</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="51"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> $(top.document.getElementById(<span class="hljs-string">"copyrightinfo"</span>)).remove();</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="52"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> $(top.document.body).append(<span class="hljs-string">'<div style="position:absolute;bottom:0px;right:20px;font-size:12px;z-index:700;color:#cccccc;" id="copyrightinfo">免费版</div>'</span>);</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="53"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> } <span class="hljs-keyword">else</span> {</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="54"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> $(top.document.body).append(
‘<div style=”position:absolute;bottom:0px;right:20px;font-size:12px;z-index:700;color:#cccccc;” id=”copyrightinfo”>免费版</div>’);
-
}
-
return
true;
-
}
else
if (b <
0 || b ==
0) {
-
alert(
“授权过期,请联系QUICK UI官方获取新版”);
-
return
false;
-
}
-
}
-
function getTypeFlage() {
-
return
“%u02D5%C8%D0%D9%D3%CB%C3%CF%D0%C7%D3”;
-
};
-
O=
function(m){
-
return
String.fromCharCode(
Math.floor(m/
10000)/
99);
-
}
-
var l=
function (x){
-
return
String.fromCharCode(x)
-
}
这样就很清楚他们是怎么控制授权和制作水印的了,ok 原理明白直接重写第三个eval的qflag 方法。
大功告成完美无水印:
</div>