給你轉(zhuǎn)帖 javascript加密七種方法:
在新野等地區(qū),都構建了全面的區(qū)域性戰(zhàn)略布局,加強發(fā)展的系統(tǒng)性、市場前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務理念,為客戶提供網(wǎng)站設計、網(wǎng)站制作 網(wǎng)站設計制作專業(yè)公司,公司網(wǎng)站建設,企業(yè)網(wǎng)站建設,品牌網(wǎng)站建設,全網(wǎng)營銷推廣,成都外貿(mào)網(wǎng)站制作,新野網(wǎng)站建設費用合理。
在做網(wǎng)頁時(其實是網(wǎng)頁木馬呵呵),最讓人煩惱的是自己辛辛苦苦寫出來的客戶端IE運行的javascript代碼常常被別人輕易的拷貝,實在讓自己的心里有點不是滋味,要知道自己寫點東西也挺累的......^*^
但我們也應該清楚地認識到因為javascript代碼是在IE中解釋執(zhí)行,要想絕對的保密是不可能的,我們要做的就是盡可能的增大拷貝者復制的難度,讓他知難而退(但愿~!~),下面我結合自己這幾年來的實踐,及個人研究的心得,和大家一起來探討一下網(wǎng)頁中javascript代碼的加密解密技術。
以加密下面的javascript代碼為例:
SCRIPT LANGUAGE="javascript"
alert("《我愛一起》");
/SCRIPT
一:最簡單的加密解密
大家對于javascript函數(shù)escape()和unescape()想必是比較了解啦(很多網(wǎng)頁加密在用它們),分別是編碼和解碼字符串,比如例子代碼用escape()函數(shù)加密后變?yōu)槿缦赂袷剑?/p>
alert%28%22%u9ED1%u5BA2%u9632%u7EBF%22%29%3B
如何?還看的懂嗎?當然其中的ASCII字符"alert"并沒有被加密,如果愿意我們可以寫點javascript代碼重新把它加密如下:
%61%6C%65%72%74%28%22%u9ED1%u5BA2%u9632%u7EBF%22%29%3B
呵呵!如何?這次是完全都加密了!
當然,這樣加密后的代碼是不能直接運行的,幸好還有eval(codeString)可用,這個函數(shù)的作用就是檢查javascript代碼并執(zhí)行,必選項 codeString 參數(shù)是包含有效 javascript 代碼的字符串值,加上上面的解碼unescape(),加密后的結果如下:
SCRIPT LANGUAGE="javascript"
var code=unescape("%61%6C%65%72%74%28%22%u9ED1%u5BA2%u9632%u7EBF%22%29%3B");
eval(code)
/SCRIPT
是不是很簡單?不要高興,解密也就同樣的簡單,解密代碼都擺給別人啦(unescape())!呵呵
二:轉(zhuǎn)義字符""的妙用
大家可能對轉(zhuǎn)義字符""不太熟悉,但對于javascript提供了一些特殊字符如:n (換行)、 r (回車)、' (單引號)等應該是有所了解的吧?其實""后面還可以跟八進制或十六進制的數(shù)字,如字符"a"則可以表示為:"141"或"x61"(注意是小寫字符"x"),至于雙字節(jié)字符如漢字"黑"則僅能用十六進制表示為"u9ED1"(注意是小寫字符"u"),其中字符"u"表示是雙字節(jié)字符,根據(jù)這個原理例子代碼則可以表示為:
八進制轉(zhuǎn)義字符串如下:
SCRIPT LANGUAGE="javascript"
eval("1411541451621645042u9ED1u5BA2u9632u7EBF425173")
/SCRIPT
十六進制轉(zhuǎn)義字符串如下:
SCRIPT LANGUAGE="javascript"
eval("x61x6Cx65x72x74x28x22u9ED1u5BA2u9632u7EBFx22x29x3B")
/SCRIPT
這次沒有了解碼函數(shù),因為javascript執(zhí)行時會自行轉(zhuǎn)換,同樣解碼也是很簡單如下:
SCRIPT LANGUAGE="javascript"
alert("x61x6Cx65x72x74x28x22u9ED1u5BA2u9632u7EBFx22x29x3B")
/SCRIPT
就會彈出對話框告訴你解密后的結果!
三:使用Microsoft出品的腳本編碼器Script Encoder來進行編碼
工具的使用就不多介紹啦!我是直接使用javascript調(diào)用控件Scripting.Encoder完成的編碼!代碼如下:
SCRIPT LANGUAGE="javascript"
var Senc=new ActiveXObject("Scripting.Encoder");
var code='SCRIPT LANGUAGE="javascript"rnalert("《我愛一起》");rn/SCRIPT';
var Encode=Senc.EncodeScriptFile(".htm",code,0,"");
alert(Encode);
/SCRIPT
編碼后的結果如下:
SCRIPT LANGUAGE="JScript.Encode"#@~^FgAAAA==@#@ls DD`J黑客防線r#p@#@FgMAAA==^#~@/SCRIPT
夠難看懂得吧?但相應的解密工具早已出來,而且連解密網(wǎng)頁都有!因為其解密網(wǎng)頁代碼過多,我就不多說拉!給大家介紹一下我獨創(chuàng)的解密代碼,如下:
SCRIPT LANGUAGE="JScript.Encode"
function decode()
alert(decode.toString());
/SCRIPT
咋樣?夠簡單吧?它是原理是:編碼后的代碼運行前IE會先對其進行解碼,如果我們先把加密的代碼放入一個自定義函數(shù)如上面的decode()中,然后對自定義函數(shù)decode調(diào)用toString()方法,得到的將是解碼后的代碼!
如果你覺得這樣編碼得到的代碼LANGUAGE屬性是JScript.Encode,很容易讓人識破,那么還有一個幾乎不為人知的window對象的方法execScript(),其原形為:
window.execScript( sExpression, sLanguage )
參數(shù):
sExpression: 必選項。字符串(String)。要被執(zhí)行的代碼。
sLanguage : 必選項。字符串(String)。指定執(zhí)行的代碼的語言。默認值為 Microsoft JScript
使用時,前面的"window"可以省略不寫!
利用它我們可以很好的運行編碼后的javascript代碼,如下:
SCRIPT LANGUAGE="javascript"
execScript("#@~^FgAAAA==@#@ls DD`J我愛一起r#p@#@FgMAAA==^#~@","JScript.Encode")
/SCRIPT
你可以利用方法二對其中的""號內(nèi)的字符串再進行編碼,使得"JScript.Encode"以及編碼特征碼"#@~^"不出現(xiàn),效果會更好!
四:任意添加NUL空字符(十六進制00H)
一次偶然的實驗,使我發(fā)現(xiàn)在HTML網(wǎng)頁中任意位置添加任意個數(shù)的"空字符",IE照樣會正常顯示其中的內(nèi)容,并正常執(zhí)行其中的javascript 代碼,而添加的"空字符"我們在用一般的編輯器查看時,會顯示形如空格或黑塊,使得原碼很難看懂,如用記事本查看則"空字符"會變成"空格",利用這個原理加密結果如下:(其中顯示的"空格"代表"空字符")
S C RI P T L ANG U A G E =" J a v a S c r i p t "
a l er t (" 我 愛 一 起") ;
/ SC R I P T
如何?是不是顯得亂七八糟的?如果不知道方法的人很難想到要去掉里面的"空字符"(00H)的!
五:無用內(nèi)容混亂以及換行空格TAB大法
在javascript代碼中我們可以加入大量的無用字符串或數(shù)字,以及無用代碼和注釋內(nèi)容等等,使真正的有用代碼埋沒在其中,并把有用的代碼中能加入換行、空格、TAB的地方加入大量換行、空格、TAB,并可以把正常的字符串用""來進行換行,這樣就會使得代碼難以看懂!如我加密后的形式如下:
SCRIPT LANGUAGE="javascript"
"xajgxsadffgds";1234567890
625623216;var $=0;alert//@$%%*()((^%^
//cctv function//
(//hhsaasajx xc
/*
asjgdsgu*/
"我愛一起"http://ashjgfgf
/*
@#%$^%$96667r45fggbhytjty
*/
//window
)
;"#@$#%@#432hu";212351436
/SCRIPT
至少如果我看到這樣的代碼是不會有心思去分析它的,你哪?
六:自寫解密函數(shù)法
這個方法和一、二差不多,只不過是自己寫個函數(shù)對代碼進行解密,很多VBS病毒使用這種方法對自身進行加密,來防止特征碼掃描!下面是我寫的一個簡單的加密解密函數(shù),加密代碼如下(詳細參照文件"加密.htm"):
SCRIPT LANGUAGE="javascript"
function compile(code)
{
var c=String.fromCharCode(code.charCodeAt(0)+code.length);
for(var i=1;icode.length;i++)
alert(escape(c));
}
compile('alert("《我愛一起》");')
/SCRIPT
運行得到加密結果為:
o%CD%D1%D7%E6%9CJ%u9EF3%uFA73%uF1D4%u14F1%u7EE1Kd
相應的加密后解密的代碼如下:
SCRIPT LANGUAGE="javascript"
function uncompile(code)
{
code=unescape(code);
var c=String.fromCharCode(code.charCodeAt(0)-code.length);
for(var i=1;icode.length;i++)
return c;
}
eval(uncompile("o%CD%D1%D7%E6%9CJ%u9EF3%uFA73%uF1D4%u14F1%u7EE1Kd"));
/SCRIPT
七:錯誤的利用
利用try{}catch(e){}結構對代碼進行測試解密,雖然這個想法很好(呵呵,夸夸自己),因為實用性不大,我僅給個例子
SCRIPT LANGUAGE="javascript"
var a='alert("《我愛一起》");';
var c="";
for(var i=0;ia.length;i++)
alert(c);
//上面的是加密代碼,當然如果真正使用這個方法時,不會把加密寫上的
//現(xiàn)在變量c就是加密后的代碼
//下面的函數(shù)t()先假設初始密碼為0,解密執(zhí)行,
//遇到錯誤則把密碼加1,然后接著解密執(zhí)行,直到正確運行
var d=c; //保存加密后的代碼
var b=0; //假定初始密碼為0
t();
function t()catch(e){
c="";
for(var i=0;id.length;i++)
b+=1;
t();
//setTimeout("t()",0);
}
}
/SCRIPT
JavaScript作為網(wǎng)站前端的核心知識是非常重要的,但是如何學習JavaScript是很多初學者面對的一個難題,下面我說一下個人對于如何學習JavaScript的一點心得,希望能幫到大家。
1、首先學習基礎,尤其是JavaScript與其他語言不同的基礎知識。
學習每個編程語言可能都要從基礎的變量函數(shù)結構等學起,JavaScript相對于其他的編程語言在基礎上有一些比較有特點的地方,這些東西是尤其需要我們注意的,比如說自調(diào)函數(shù)、比如說變量值為空不是null而是undefined的等,這些東西都是和主流的編程的語言如c++、java等是有區(qū)別的,所以想要學好JavaScript,這些基礎的知識一定要把握好學習好才行。
2、關于學習JavaScript的進階
JavaScript進階知識更是有很多難理解的東西和不同于其他語言的東西,這些東西都是深入學習JavaScript的難點,簡單的說一下JavaScript是基于對象的瀏覽器腳本語言,但是為了使JavaScript也能夠支持面向?qū)ο缶幊蹋藗兙褪褂昧撕芏嗟姆椒▉砟M面向?qū)ο蟮牡奶攸c,這些就變成了JavaScript的一些難點,比如說JavaScript的繼承要借助原型、比如JavaScript的類需要使用構造函數(shù)來構造一個對象等,這些東西都是和其他支持面向?qū)ο蟮恼Z言是不同的,所以就導致了一些難點。關于進階學習JavaScript,還有JavaScript一些深入的知識需要去理解比如原型鏈和閉包、比如收函數(shù)的作用域執(zhí)行流程和上下文,這些東西都是JavaScript比較深入的知識、
最后說明,JavaScript作為前端的核心語言絕對沒有沒有想象的那么簡單,要想學好JavaScript除了以上提到的知識和注意點,還需要的就是多動手和實踐,我們都知道網(wǎng)頁上的所有特效都是借助JavaScript來實現(xiàn),那么我們就需要在學習JavaScript的過程中多使用原生的JavaScript代碼實現(xiàn)一些特效,當然學習使用jQuery等JavaScript類庫進行開發(fā)也十分的重要,但是這絕對不能是取代我們學習JavaScript的方法。
APIkey 可以點開 amplitude 的settings 里的Projects 中點擊想要買埋點的項目中去復制過來,后面的userId是用戶的ID,唯一標識
下面就可以在項目中進行埋點了,埋點一般使用的多的就是logEvent 和setUserProperties,來進行一般事件的埋點和用戶屬性的埋點 ,更多事件可以點擊
埋點成功后在項目運行后,在瀏覽器可以看到有一個amplitude的請求發(fā)出,在amplitude網(wǎng)頁中的user look-up 可以看到埋點出現(xiàn)的信息,如下圖:
產(chǎn)品經(jīng)理一定是要懂技術的,首先不管你是什么產(chǎn)品,是實體產(chǎn)品也好,還是設計產(chǎn)品也好,甚至是虛擬產(chǎn)品也罷,既然你是產(chǎn)品經(jīng)理,那對于自己的產(chǎn)品的相關技術參數(shù),文件都要有一定的了解。
這里說的懂,并不是說一定要和你們公司的的技術人員一樣鉆研的那么透徹,最起碼的對于自己的產(chǎn)品祥關的技術環(huán)節(jié),基本點技術參數(shù)都要熟記于心,有些相關的技術資料可以不用深入考究其原理意思,但一定要能在客戶的提問下一一回答,因為如果與客戶溝通的時候,難免會遇上一些看懂行業(yè)的專業(yè)級客戶,通常這樣的客戶就會問出與產(chǎn)品技術方面極為相關的問題,因為專業(yè)的客戶并不會完全相信你的口頭產(chǎn)品承諾,他們更會愿意用實打?qū)嵉募夹g資料及參數(shù)去對比你們家的產(chǎn)品優(yōu)勢在哪里,劣勢在哪里。從而決定是否選擇你所提供的產(chǎn)品。這個時候如果你能極其流暢的像你的客戶介紹你的產(chǎn)品的相關技術內(nèi)容,首先客戶會對你這個人感到非常的專業(yè),覺得你會非常的靠譜。其次詳細的技術參數(shù)的介紹會讓你的客戶對你的產(chǎn)品得到更加詳細的信息,這樣客戶心理會更加愿意選擇他們所詳細了解的產(chǎn)品。還有就是在公司內(nèi)部溝通的時候,不懂技術的產(chǎn)品經(jīng)理在和自己公司里的技術人員溝通的時候會非常的有困難,通常情況下技術人員都有一個通病,那就是他們在研究技術問題的時候超級有耐心,但是在與人溝通的時候會一點耐心都沒有,他們希望自己一說你就能聽明白,這個時候如果你聽不懂,反而會找來他們的反感,從而學習產(chǎn)品技術的渠道就更加的困難。所以在自己空閑的時候,即使是一位產(chǎn)品經(jīng)理,也應該要了解產(chǎn)品相關的技術。
前端
賬戶名、密碼、驗證碼 是否為空?
密碼是否符合規(guī)則(特殊字符、大小寫、數(shù)字、長度..)
驗證碼是否正確 (對應時間戳是否過期)
賬戶是否存在 (未注冊、已注銷)
密碼是否正確? (記錄連續(xù)輸入錯誤次數(shù),超過5次,賬號鎖定4小時?;蛱嵘炞C等級,采取賬號+密碼+驗證碼+短信驗證)
返回session、token
(1)web從FilManager服務獲取驗證碼
(2)FilManager據(jù)wb 上傳的時間(長度為 19 位數(shù)字,精確到微妙),生成驗證碼
圖片,并記錄時間戳對應的驗證碼。
(3)web獲取用戶輸入的賬號,密碼(md5加密),驗證碼信息發(fā)行到login svr(今后
application svr 可能還會帶上用戶使用瀏覽器類型等用戶環(huán)境信息)。
(4),login svr通過時間(精確到微妙)獲取驗證碼字符串。
(5)login svr根據(jù) web獲取的用戶信息動態(tài)計算確定用戶的認證等級,如果為默認認證方式,驗證賬號,密碼,驗證碼是否正確,如果正確返回驗證成功以及相應的 session ID; login svr還要在 redis 中記錄當前用戶 session 對應的信息,供鑒權服務使用
(6)如果 login svr動態(tài)計算的用戶認證級別高于默認級別,則 login svr返回對應的認證級別,web需要根據(jù)返回的結果提升認證級別,比如 OTP認證等等
(7) login svr記錄用戶登入日志(包括但不限于地址等)
輸入正確的用戶名和密碼登錄成功
輸入錯誤的用戶名密碼登錄失敗
用戶名正確,密碼錯誤,是否提示輸入密碼錯誤?
用戶名錯誤,密碼正常,是否提示輸入用戶名錯誤?
用戶名和密碼都錯誤,是否有相應提示?
用戶名密碼為空時,是否有相應提示?
如果用戶未注冊,提示請先注冊,然后進行登錄
已經(jīng)注銷的用戶登錄失敗,提示信息友好?
密碼框是否加密顯示?
用戶名是否支持中文、特殊字符?
用戶名是否有長度限制?
密碼是否支持中文,特殊字符?
密碼是否有長度限制?
密碼是否區(qū)分大小寫?
密碼為一些簡單常用字符串時,是否提示修改?如:123456
密碼存儲方式?是否加密?
登錄功能是否需要輸入驗證碼?
驗證碼有效時間?
驗證碼輸入錯誤,登錄失敗,提示信息是否友好?
輸入過期的驗證能否登錄成功?
驗證碼是否容易識別?
驗證碼換一張功能是否可用?
點擊驗證碼圖片是否可以更換驗證碼?
用戶體系:
比如系統(tǒng)分普通用戶、高級用戶,不同用戶登錄系統(tǒng)后可的權限不同。
如果使用第三方賬號(QQ,微博賬號)登錄,那么第三方賬號與本系統(tǒng)的賬號體系對應關系如何保存?首次登錄需要極權等
登錄頁面顯示是否正常?文字和圖片能否正常顯示,相應的提示信息是否正確,按鈕的設置和排列是否正常,頁面是否簡潔壯觀等。
頁面默認焦點是否定位在用戶名的輸入框中
首次登錄時相應的輸入框是否為空?或者如果有默認文案,當點擊輸入框時默認方案是否消失?
相應的按鈕如登錄、重置等,是否可用;頁面的前進、后退、刷新按鈕是否可用?
快捷鍵Tab,Esc,Enter?等,能否控制使用
兼容性測試:不同瀏覽器,不同操作系統(tǒng),不同分辨率下界面是否正常
不登錄:瀏覽器中直接輸入登錄后的地址,看是否可以直接進入
登錄成功后生成的Cookie,是否是httponly?(否則容易被腳本盜取)
用戶名和密碼是否通過加密的方式,發(fā)送給Web服務器
用戶名和密碼的驗證,應該是用服務器端驗證,?而不能單單是在客戶端用javascript驗證
用戶名和密碼的輸入框,應該屏蔽SQL?注入攻擊
用戶名和密碼的的輸入框,應該禁止輸入腳本?(防止XSS攻擊)
錯誤登陸的次數(shù)限制(防止暴力破解)
考慮是否支持多用戶在同一機器上登錄;
考慮一用戶在多臺機器上登錄
單用戶登錄系統(tǒng)的響應時間是否符合"3-5-8"原則
用戶數(shù)在臨界點時并發(fā)登錄是否還能符合"3-5-8"原則
壓力:大量并發(fā)用戶登錄,系統(tǒng)的響應時間是多少?系統(tǒng)會出現(xiàn)宕機、內(nèi)存泄露、cpu飽和、無法登錄嗎?
穩(wěn)定性:?系統(tǒng)能否處理并發(fā)用戶數(shù)在臨界點以內(nèi)連續(xù)登錄N個時的場景?
1.主流的瀏覽器(IE6,7,8,9,?Firefox,?Chrome,?Safari等)
2.不同的平臺,比如Windows,?Mac
3.移動設備上,比如Iphone,?Andriod
4.不同的分辨率能否正常顯示
連續(xù)輸入3次或以上錯誤密碼,用記是否被鎖一定時間(如:15分鐘)?時間內(nèi)不允許登錄,超出時間點是否可以繼續(xù)登錄。
用戶session過期后,重新登錄是否還能重新返回這前session過期的頁面?
用戶名和密碼輸入框是事支持鍵盤快捷鍵?如:撤銷、復制、粘貼等等
是否允許同名用戶同時登錄進行操作?考慮web和app同時登錄
手機登錄時,是否先判斷網(wǎng)絡可用?
手機登錄時,是否先判斷app存在新版本?
是否支持單點登錄?
是否有埋點接口
基本功能測試點
1.輸入正確的用戶名和密碼,點擊提交按鈕,驗證是否能正確登錄。
2.輸入錯誤的用戶名或者密碼, 驗證登錄會失敗,并且提示相應的錯誤信息。
輸入錯誤的用戶名和密碼
輸入正確的用戶名,錯誤的密碼
輸入錯誤的用戶名,正確的密碼
3.登錄成功后能否能否跳轉(zhuǎn)到正確的頁面
4.用戶名和密碼,如果太短或者太長,應該怎么處理
5.用戶名和密碼,有特殊字符(比如空格),和其他非英文的情況
?? 6.密碼是否區(qū)分大小寫
?? 7.密碼簡單,是否提示
8.用戶名和密碼前后有空格的處理
9.密碼是否加密顯示(星號圓點等)
10.牽扯到驗證碼的,還要考慮文字是否扭曲過度導致辨認難度大,考慮顏色(色盲使用者),刷新或換一個按鈕是否好用
11.登錄頁面中的注冊、忘記密碼,登出用另一帳號登陸等鏈接是否正確
12.輸入密碼的時候,大寫鍵盤開啟的時候要有提示信息。
13.記住用戶名的功能
14.登陸失敗后,不能記錄密碼的功能
界面測試(UI Test)
1.布局是否合理,2個testbox 和一個按鈕是否對齊
2.testbox和按鈕的長度,高度是否復合要求
3. 界面的設計風格是否與UI的設計風格統(tǒng)一
4. 界面中的文字簡潔易懂,沒有錯別字。
性能測試(performance test)
1.打開登錄頁面,需要幾秒
2.輸入正確的用戶名和密碼后,登錄成功跳轉(zhuǎn)到新頁面,不超過5秒
安全性測試(Security test)
0 不登錄:瀏覽器直接輸入登陸后,能否直接進入
? 1.登錄成功后生成的Cookie,是否是httponly (否則容易被腳本盜取)
2.用戶名和密碼是否通過加密的方式,發(fā)送給Web服務器
3.用戶名和密碼的驗證,應該是用服務器端驗證, 而不能單單是在客戶端用javascript驗證
4.用戶名和密碼的輸入框,應該屏蔽SQL 注入攻擊
5.用戶名和密碼的的輸入框,應該禁止輸入腳本 (防止XSS攻擊)
6.錯誤登陸的次數(shù)限制(防止暴力破解)
7. 考慮是否支持多用戶在同一機器上登錄;
8. 考慮一用戶在多臺機器上登錄
易用性測試(Usability Test)
1. 是否可以全用鍵盤操作,是否有快捷鍵
2. 輸入用戶名,密碼后按回車,是否可以登陸
3. 輸入框能否可以以Tab鍵切換
兼容性測試(Compatibility Test)
1.主流的瀏覽器下能否顯示正常已經(jīng)功能正常(IE,6,7,8,9, Firefox, Chrome, Safari,等)
性能測試
1.單用戶登陸系統(tǒng)的響應時間是否符合2-5-8原則
2.用戶數(shù)在臨界點時并發(fā)登陸是否還能符合2-5-8原則
3.壓力:大量并發(fā)用戶登陸,系統(tǒng)的響應時間是多少?系統(tǒng)會出現(xiàn)宕機、內(nèi)存泄露、CPU飽和、無法登陸嗎?
4.穩(wěn)定性:系統(tǒng)能否處理并發(fā)用戶數(shù)在臨界點以內(nèi)連續(xù)登錄N個時的場景?
其他測試
1.連續(xù)輸入3次或以上錯誤密碼,用戶被鎖定,聯(lián)系系統(tǒng)管理員解鎖
2,用戶session過期后,重新登陸是否還能重新返回到session過期的頁面
3、用戶名和密碼是否支持鍵盤快捷鍵,比如撤銷、復制、粘貼
4.是否允許同名用戶同時登陸進行操作
5.是否支持單點登陸
6.是否有埋點接口