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