動(dòng)易SiteFactory新特性體驗(yàn)之旅——全面提高的安全性
對(duì)于CMS系統(tǒng)來(lái)說(shuō),安全性的重要可想而知!如果一個(gè)系統(tǒng)的功能再?gòu)?qiáng)大、再易用,如果安全性不好,那就是失敗的產(chǎn)品。所以,動(dòng)易開(kāi)發(fā)團(tuán)隊(duì)在安全方面做了最大努力的工作。我們看動(dòng)易CMS2007的新特性中有這么一項(xiàng):
以下是引用片段: 全面提高的安全性 動(dòng)易CMS 2007保留了動(dòng)易CMS 2006成熟的安全防范措施,并且借助Asp.Net的特性和功能對(duì)各種攻擊方式進(jìn)行全方位的防范。 根據(jù)OWASP組織發(fā)布的2007年Web應(yīng)用程序脆弱性10大排名統(tǒng)計(jì),跨站腳本、注入漏洞、跨站請(qǐng)求偽造、信息泄露等幾方面仍然是目前流行的攻擊方式。動(dòng)易CMS 2007針對(duì)每種攻擊方式都制定了一套完整的防御方案,可以有效的抵制惡意用戶(hù)對(duì)網(wǎng)站進(jìn)行的攻擊,提高網(wǎng)站的安全性 |
關(guān)于動(dòng)易CMS2007的安全性,我們已經(jīng)在/Blog/kuaibao/3050.html這篇文章中概述性講過(guò)了。
寫(xiě)這篇文章的時(shí)候,開(kāi)發(fā)團(tuán)隊(duì)將動(dòng)易CMS 2007中用到的安全技術(shù)和手段做了一下小結(jié)。下面就是他們列出來(lái)的一份防范措施清單:
以下是引用片段: 1、密碼保護(hù): ●用戶(hù)密碼的MD5加密 ●利用密碼強(qiáng)度限制,排除存在弱密碼的可能性 ●后臺(tái)登錄啟用驗(yàn)證碼防止利用工具窮舉破解密碼 ●后臺(tái)登錄啟用管理認(rèn)證碼(保存在.config文件中)加強(qiáng)密碼保護(hù)的強(qiáng)度 2、輸入驗(yàn)證: ●利用驗(yàn)證控件,對(duì)用戶(hù)輸入的數(shù)據(jù)進(jìn)行類(lèi)型、大小、范圍的驗(yàn)證 3、訪(fǎng)問(wèn)限制: ●后臺(tái)管理目錄可以通過(guò)網(wǎng)站信息配置進(jìn)行修改來(lái)防止攻擊 ●全站和管理后臺(tái)的IP訪(fǎng)問(wèn)限定功能可以實(shí)現(xiàn)訪(fǎng)問(wèn)范圍的最小化 ●后臺(tái)管理文件對(duì)訪(fǎng)問(wèn)用戶(hù)身份的統(tǒng)一驗(yàn)證 ●從整體上限制直接輸入地址或通過(guò)外部鏈接訪(fǎng)問(wèn)后臺(tái)文件 4、注入漏洞攻擊防范: ●使用類(lèi)型安全的SQL參數(shù)化查詢(xún)方式,從根本上解決SQL注入的問(wèn)題 ●對(duì)于不能使用參數(shù)化查詢(xún)的部分(比如in、like語(yǔ)句),使用嚴(yán)格的過(guò)濾函數(shù)進(jìn)行過(guò)濾 ●限定URL的傳遞參數(shù)類(lèi)型、數(shù)量、范圍等來(lái)防止通過(guò)構(gòu)造URL進(jìn)行惡意攻擊 5、跨站腳本攻擊防范: ●對(duì)于不支持HTML標(biāo)記的內(nèi)容使用HTMLEncode進(jìn)行編碼 ●對(duì)于支持HTML標(biāo)記的內(nèi)容使用腳本過(guò)濾函數(shù)來(lái)過(guò)濾絕大部分可運(yùn)行的腳本代碼,作為防范的輔助措施 ●通過(guò)frame的安全屬性security="restricted"來(lái)阻止腳本的運(yùn)行(IE有效) ●使用Cookie的HttpOnly屬性來(lái)防止Cookie通過(guò)腳本泄密(IE6 SP1以上、Firefox 3) 6、跨站請(qǐng)求偽造防范: ●禁止通過(guò)地址欄直接訪(fǎng)問(wèn)或者通過(guò)外部鏈接訪(fǎng)問(wèn)后臺(tái)管理頁(yè)面 ●通過(guò)設(shè)置ViewStateUserKey屬性防止受到惡意用戶(hù)的點(diǎn)擊式攻擊(對(duì)應(yīng)Post方式) ●通過(guò)對(duì)鏈接追加安全驗(yàn)證碼(HMACSHA1)防止跨站請(qǐng)求偽造(對(duì)應(yīng)Get方式) 7、信息泄露防范: ●網(wǎng)站的配置信息保存在Site.config文件中,.config文件是默認(rèn)拒絕訪(fǎng)問(wèn)的文件類(lèi)型,以避免配置信息泄密; ●利用web.config中配置的自定義錯(cuò)誤頁(yè)和全局的異常處理,屏蔽異常出現(xiàn)時(shí)暴露的敏感信息; ●對(duì)數(shù)據(jù)庫(kù)連接字符串進(jìn)行加密,在配置信息泄密后保護(hù)數(shù)據(jù)庫(kù)連接的敏感信息; 8、上傳下載防范: ●Access數(shù)據(jù)庫(kù)防下載功能 ●對(duì)上傳文件類(lèi)型進(jìn)行檢查,并刪除黑名單中列出類(lèi)型的文件 ●對(duì)上傳文件的實(shí)際類(lèi)型進(jìn)行檢查 9、其他措施: ●跟蹤用戶(hù)操作異常和系統(tǒng)異常,并詳細(xì)記錄到日志中,以便于分析 ●對(duì)程序集進(jìn)行強(qiáng)命名,以防止非法篡改程序集 ●對(duì)程序集進(jìn)行加密和混淆,避免惡意用戶(hù)通過(guò)反射程序集利用代碼漏洞進(jìn)行攻擊 ●在線(xiàn)文件比較功能檢查網(wǎng)站中可能存在的木馬程序 ●管理員最后修改密碼日期 ●………… |
從這份長(zhǎng)長(zhǎng)的清單中,大家可以看到動(dòng)易開(kāi)發(fā)團(tuán)隊(duì)在動(dòng)易CMS2007的安全問(wèn)題上所做的努力吧??梢院敛豢鋸埖恼f(shuō):動(dòng)易CMS2007將是動(dòng)易史上最安全的產(chǎn)品?!扒盁o(wú)古人”,動(dòng)易CMS2007做到了。而后面的版本則將在此基礎(chǔ)更安全。動(dòng)易每一個(gè)版本肯定會(huì)比以前的版本更安全,因?yàn)槲覀冏允贾两K都將產(chǎn)品的安全性放在最重要的位置。
下面我來(lái)一一為大家介紹一下這些防范措施:
以下是引用片段: 1、密碼保護(hù): ●用戶(hù)密碼的MD5加密 ●利用密碼強(qiáng)度限制,排除存在弱密碼的可能性 ●后臺(tái)登錄啟用驗(yàn)證碼防止利用工具窮舉破解密碼 ●后臺(tái)登錄啟用管理認(rèn)證碼(保存在.config文件中)加強(qiáng)密碼保護(hù)的強(qiáng)度 |
這個(gè)不用我多做說(shuō)明,大家應(yīng)該都知道?;旧线@是現(xiàn)在的軟件產(chǎn)品在安全方面的標(biāo)準(zhǔn)配置了。如果某個(gè)軟件連這些都沒(méi)有,其安全性可想而知。
以下是引用片段: 2、輸入驗(yàn)證: ●利用驗(yàn)證控件,對(duì)用戶(hù)輸入的數(shù)據(jù)進(jìn)行類(lèi)型、大小、范圍的驗(yàn)證 |
這個(gè)也不需多說(shuō)。這是ASP.NET的特性之一。動(dòng)易CMS2007全面使用了ASP.NET這些特性來(lái)加強(qiáng)產(chǎn)品的安全性。
以下是引用片段: 3、訪(fǎng)問(wèn)限制: ●后臺(tái)管理目錄可以通過(guò)網(wǎng)站信息配置進(jìn)行修改來(lái)防止攻擊 ●全站和管理后臺(tái)的IP訪(fǎng)問(wèn)限定功能可以實(shí)現(xiàn)訪(fǎng)問(wèn)范圍的最小化 ●后臺(tái)管理文件對(duì)訪(fǎng)問(wèn)用戶(hù)身份的統(tǒng)一驗(yàn)證 ●從整體上限制直接輸入地址或通過(guò)外部鏈接訪(fǎng)問(wèn)后臺(tái)文件 |
通過(guò)將后臺(tái)管理目錄名改成只有站長(zhǎng)才知道的目錄名,可以有效防止黑客對(duì)后臺(tái)的猜測(cè)和攻擊。這里利用了ASP.NET的URL映射功能。實(shí)際目錄名并沒(méi)有改變。
通過(guò)IP來(lái)訪(fǎng)限定功能,黑客即使知道后臺(tái)目錄,也無(wú)法訪(fǎng)問(wèn)后臺(tái),可以將攻擊最小化。
利用了ASP.NET的身份驗(yàn)證功能,對(duì)后臺(tái)管理文件的訪(fǎng)問(wèn)權(quán)限進(jìn)行了統(tǒng)一驗(yàn)證。普通用戶(hù)無(wú)法訪(fǎng)問(wèn)后臺(tái)文件。
利用ASP.NET的HttpModule,從整體上限制直接輸入地址或通過(guò)外部鏈接訪(fǎng)問(wèn)后臺(tái)文件
關(guān)于HttpModule的相關(guān)知識(shí)和概念,大家可以在網(wǎng)上搜索一下。我這里稍微解釋一下。當(dāng)一個(gè)HTTP請(qǐng)求到達(dá)HttpModule時(shí),整個(gè)ASP.NET Framework系統(tǒng)還并沒(méi)有對(duì)這個(gè)HTTP請(qǐng)求做任何處理,也就是說(shuō)此時(shí)對(duì)于HTTP請(qǐng)求來(lái)講,HttpModule是一個(gè)HTTP請(qǐng)求的“必經(jīng)之路”,所以可以在這個(gè)HTTP請(qǐng)求傳遞到真正的請(qǐng)求處理中心(HttpHandler)之前附加一些需要的信息在這個(gè)HTTP請(qǐng)求信息之上,或者針對(duì)截獲的這個(gè)HTTP請(qǐng)求信息作一些額外的工作,或者在某些情況下干脆終止?jié)M足一些條件的HTTP請(qǐng)求,從而可以起到一個(gè)Filter過(guò)濾器的作用。動(dòng)易CMS2007利用ASP.NET的這一特性,在HttpModule里對(duì)提交給服務(wù)器的數(shù)據(jù)進(jìn)行了嚴(yán)格過(guò)濾,從整體上限制直接輸入地址或通過(guò)外部鏈接訪(fǎng)問(wèn)后臺(tái)文件,從而在很大程度上增強(qiáng)了系統(tǒng)的安全性。
以下是引用片段: 4、注入漏洞攻擊防范:
●使用類(lèi)型安全的SQL參數(shù)化查詢(xún)方式,從根本上解決SQL注入的問(wèn)題 ●對(duì)于不能使用參數(shù)化查詢(xún)的部分(比如in、like語(yǔ)句),使用嚴(yán)格的過(guò)濾函數(shù)進(jìn)行過(guò)濾 ●限定URL的傳遞參數(shù)類(lèi)型、數(shù)量、范圍等來(lái)防止通過(guò)構(gòu)造URL進(jìn)行惡意攻擊 |
在A(yíng)SP/PHP程序中,查詢(xún)語(yǔ)句的生成一般是這樣的代碼方式:
Conn.Execute("SELECT Province FROM PE_Province WHERE Country='" & Country & "' ORDER BY ProvinceID")
這樣的方式,如果一不小心沒(méi)有對(duì)要放入SQL查詢(xún)語(yǔ)句中的Country變量進(jìn)行防SQL注入過(guò)濾,就有可能產(chǎn)生注入問(wèn)題。這方面的教程實(shí)在太多,大家有興趣可以到網(wǎng)上搜索一下。而由此帶來(lái)的教訓(xùn)則是非常深刻。動(dòng)易之前發(fā)現(xiàn)的一些注入漏洞問(wèn)題,都是因?yàn)槌绦騿T不小心沒(méi)有過(guò)濾有關(guān)變量造成的。而縱觀(guān)網(wǎng)上許多程序,還有許多地方是根本就沒(méi)有將提交過(guò)來(lái)的值進(jìn)行過(guò)濾就放入查詢(xún)語(yǔ)句中。如:
Sql = "SELECT Boardid, Boardtype, Boarduser FROM Board WHERE Boardid = " & Request("boardid")
Set Rs = Execute(Sql)
這樣的程序的安全性可想而知。
動(dòng)易CMS2007中,所有的查詢(xún)語(yǔ)句都是類(lèi)似如下代碼:
以下是代碼片段: /// /// 更新作者 /// /// 作者實(shí)體 /// 更新成功返回true,否則返回false public bool Update(AuthorInfo authorInfo) { Parameters parms = new Parameters(); parms.AddInParameter("@ID", DbType.Int32, authorInfo.Id); parms.AddInParameter("@UserId", DbType.Int32, authorInfo.UserId); parms.AddInParameter("@Name", DbType.String, authorInfo.Name); parms.AddInParameter("@Type", DbType.String, authorInfo.Type); ……………… return DBHelper.ExecuteProc("PE_Accessories_Author_Update", parms); } 注:這里的代碼與實(shí)際程序有所區(qū)別。 |
在這段程序中,我們至少使用了兩種安全方式。一是用了存儲(chǔ)過(guò)程,通過(guò)將參數(shù)傳遞給存儲(chǔ)過(guò)程,杜絕了注入的可能。二是參數(shù)類(lèi)型安全化,使用的參數(shù)都是強(qiáng)類(lèi)型的。如這一行代碼:parms.AddInParameter("@ID", DbType.Int32, authorInfo.Id);。限制了傳過(guò)來(lái)的參數(shù)必須是整型的,如果從頁(yè)面中傳過(guò)來(lái)的參數(shù)不是整型(注入攻擊時(shí)),就會(huì)直接拋出異常,中斷執(zhí)行。動(dòng)易CMS2007的所有查詢(xún)語(yǔ)句,都是采用這種方式。這樣基本上就杜絕了SQL注入問(wèn)題。
而對(duì)于不能使用參數(shù)化查詢(xún)的部分(比如in、like語(yǔ)句),使用嚴(yán)格的過(guò)濾函數(shù)進(jìn)行過(guò)濾。如各模塊的搜索功能的模糊查詢(xún)語(yǔ)句:"select * from aaa where Title like '%" & Keyword & "%'",在這里會(huì)對(duì)提交過(guò)來(lái)的關(guān)鍵字做嚴(yán)格的過(guò)濾。
另外,動(dòng)易CMS2007還通過(guò)限定URL的傳遞參數(shù)類(lèi)型、數(shù)量、范圍等來(lái)防止通過(guò)構(gòu)造URL進(jìn)行惡意攻擊。
以下是引用片段: 5、跨站腳本攻擊(XSS)防范: ●對(duì)于不支持HTML標(biāo)記的內(nèi)容使用HTMLEncode進(jìn)行編碼 ●對(duì)于支持HTML標(biāo)記的內(nèi)容使用腳本過(guò)濾函數(shù)來(lái)過(guò)濾絕大部分可運(yùn)行的腳本代碼,作為防范的輔助措施 ●通過(guò)frame的安全屬性security="restricted"來(lái)阻止腳本的運(yùn)行(IE有效) ●使用Cookie的HttpOnly屬性來(lái)防止Cookie通過(guò)腳本泄密(IE6 SP1以上、Firefox 3) |
根據(jù)OWASP組織發(fā)布的2007年Web應(yīng)用程序脆弱性10大排名統(tǒng)計(jì),跨站腳本、注入漏洞、跨站請(qǐng)求偽造、信息泄露等幾方面仍然是目前流行的攻擊方式。其中,跨站腳本攻擊已經(jīng)超過(guò)了SQL注入漏洞攻擊,位列首位。因?yàn)閄SS最難處理,限制得過(guò)死,正常功能也將無(wú)法使用,稍微一松,就有可能因?yàn)檫^(guò)濾不嚴(yán)而產(chǎn)生漏洞。而XSS的攻擊方式之多,可能會(huì)超乎大家的想像。我發(fā)個(gè)網(wǎng)址給大家,有興趣的人可以上去看看:
動(dòng)易的腳本過(guò)濾函數(shù)針對(duì)上述網(wǎng)址中的攻擊方式制定了一套完整的防范方案,可以有效的防范XSS攻擊。再綜合運(yùn)用上述列舉的各種防范措施,可以最大限度的防范跨站腳本攻擊。
以下是引用片段: 6、跨站請(qǐng)求偽造(CSRF)防范:
●禁止通過(guò)地址欄直接訪(fǎng)問(wèn)或者通過(guò)外部鏈接訪(fǎng)問(wèn)后臺(tái)管理頁(yè)面 ●通過(guò)設(shè)置ViewStateUserKey屬性防止受到惡意用戶(hù)的點(diǎn)擊式攻擊(對(duì)應(yīng)Post方式) ●通過(guò)對(duì)鏈接追加安全驗(yàn)證碼(HMACSHA1)防止跨站請(qǐng)求偽造(對(duì)應(yīng)Get方式) |
什么是跨站請(qǐng)求偽造?大家可以看看這篇文章:
動(dòng)易通過(guò)上述防范措施,可以最大限度的對(duì)這種攻擊方式進(jìn)行防范。
用戶(hù)登錄
還沒(méi)有賬號(hào)?
立即注冊(cè)