代码编写中会遇到的安全性问题
?
一、常用的攻擊手段
?
1.腳本注入
漏洞描述:
腳本注入攻擊在通過瀏覽器使用用戶輸入框插入惡意標(biāo)記或腳本代碼時(shí)發(fā)生。
如:某個(gè)輸入框允許用戶向數(shù)據(jù)存儲(chǔ)中插入內(nèi)容,如果將一段js腳本插入其中,則當(dāng)其他用戶使用或?yàn)g覽此數(shù)據(jù)存儲(chǔ)中的內(nèi)容時(shí),則那段js代碼會(huì)被激發(fā)執(zhí)行。如果此代碼執(zhí)行后果可想而知。
?
解決方案:
當(dāng)向數(shù)據(jù)存儲(chǔ)插入數(shù)據(jù)之前,進(jìn)行代碼過濾,屏蔽其中的惡意字符。
?
?
2.跨站點(diǎn)腳本攻擊
漏洞描述:跨站點(diǎn)腳本攻擊非常類似于腳本插入攻擊,當(dāng)惡意腳本通過其他站點(diǎn)動(dòng)態(tài)生成的web頁面插入到web瀏覽器時(shí)發(fā)生。在這種攻擊中,黑客的目標(biāo)不是我們的站點(diǎn),而是我們的用戶。
如:當(dāng)某個(gè)搜索頁面通過get的形式傳遞搜索數(shù)據(jù)時(shí)(如:xxx.com?search=XXXXX),當(dāng)在數(shù)據(jù)庫沒有查詢到此內(nèi)容,會(huì)在頁面上將用戶所搜索的信息顯示出來(如:沒有找到XXXX),那么,如果黑客在search后邊加上js代碼(如:document.cookie)則后果可想而知。
解決方案:
對(duì)用get所傳遞的參數(shù)進(jìn)行代碼過濾,屏蔽其中的惡意字符。
?
?
3.Sql注入
漏洞描述:簡單的說,sql注入就是將sql代碼傳遞到應(yīng)用程序的過程,但不是按照應(yīng)用程序開發(fā)人員預(yù)定貨期望的方式插入。由于應(yīng)用程序設(shè)計(jì)很差,常常出現(xiàn)這種sql注入,它僅僅影響使用sql?字符串構(gòu)建技術(shù)的應(yīng)用程序。如:
?
解決方案:
對(duì)數(shù)據(jù)庫操作前,屏蔽用戶所提交的字符串中sql關(guān)鍵字。
?
4.Sql union攻擊
漏洞描述:
攻擊者也可以使用sql的union語句來獲得更多的數(shù)據(jù)。盡管sql union攻擊很難,但仍然是可能的。例如帶有sql的union語句的注約束是:兩個(gè)查詢應(yīng)該從匹配的查詢中返回相同的列號(hào),表達(dá)式或聚集函數(shù)、列的數(shù)據(jù)類型。
?
?
5.對(duì)腳本注入、跨站腳本攻擊、sql注入、sql? union攻擊的總結(jié):
上述的漏洞都是系統(tǒng)常見的漏洞,也是容易注意不到的漏洞,上述的漏洞修補(bǔ)起來非常簡單,只需要兩端字符串替換代碼即可搞定,但要注意代碼的使用位置,不要在沒有必要的地方使用,否則會(huì)增加系統(tǒng)的額外負(fù)擔(dān)。
上述漏洞的具體防范措施:
5.1驗(yàn)證內(nèi)容
如果想避免我們?cè)谇懊嬉呀榻B的幾種類型的攻擊,就必須記得在處理數(shù)據(jù)的輸入前腰先驗(yàn)證它們。這種驗(yàn)證是一種很簡單的驗(yàn)證,如檢查所輸入的內(nèi)容是否為數(shù)值,是否為16或是大于16的值,或者確認(rèn)用戶僅可輸入a~z,A~Z,0~9的有效字符和一些特殊的字符。
5.2篩選用戶輸入
當(dāng)接收到來自非信任源的不恰當(dāng)輸入時(shí),并不一定要拒絕該輸入。在這種情況下,篩選輸入是最好的辦法。
5.3編碼輸入內(nèi)容
在有些情況下是允許客戶輸入如<script>等這樣的特殊字符的,但是這些字符時(shí)不允許執(zhí)行的,那么就要對(duì)一些特殊字符重新編碼。如 < 編碼為<字符。(Server.HtmlEncode(string))
5.4避免跨站點(diǎn)的腳本攻擊
避免跨站點(diǎn)的腳本攻擊的唯一方法就是在處理用戶輸入之前全面徹底地驗(yàn)證輸入內(nèi)容。
?
?
6.隱藏窗體字段
漏洞描述:開發(fā)人員有時(shí)會(huì)在頁面上使用隱藏窗體用來保存一些數(shù)據(jù)。但是這些數(shù)據(jù)可以被任何人查看。只需要用戶有一點(diǎn)點(diǎn)的html知識(shí),就可以在本地保存html頁面,修改頁面中的值,在重新經(jīng)頁面提交給服務(wù)器。
解決方案:
始終使用session對(duì)象檢查用戶是否有一個(gè)有效的會(huì)話。
不再隱藏字段中保存任何敏感信息。如果不能避免這樣做,應(yīng)該在隱藏字段保存數(shù)據(jù)時(shí),在加密的重提中保存會(huì)話密鑰和時(shí)間戳。這樣有助于驗(yàn)證來自瀏覽器的信息。
要想辦法處理隱藏字段中的數(shù)據(jù)被刪除時(shí)的情況
在客戶端檢查參數(shù)的長度和數(shù)據(jù)類型。
在服務(wù)器端重新進(jìn)行驗(yàn)證。
?
?
7.Cookies
漏洞描述:
Cookies是在http請(qǐng)求和http相應(yīng)操作期間被設(shè)置為http題頭的一小塊信息。Web開發(fā)人員也使用cookies在客戶端存儲(chǔ)數(shù)據(jù)。在cookies中保存的數(shù)據(jù)可能是會(huì)話密鑰、瀏覽器行為、購物車等內(nèi)容。黑客可以利用cookies中的信息,進(jìn)行非法操作。
解決方案:
不在cookies中保存任何敏感信息。
如必須在cookies中保存敏感信息,則使用加密技術(shù),對(duì)cookies內(nèi)容進(jìn)行加密,同時(shí)還要考慮到cookies內(nèi)容被修改或刪除的情況。
在cookies中保存敏感信息最佳的方式是使用窗體身份驗(yàn)證來創(chuàng)建加密的身份驗(yàn)證票據(jù)。
使用ssl來保護(hù)cookies不被竊取。但是ssl只能保護(hù)服務(wù)器與客戶端之間的通信信息。無法保護(hù)存在客戶端的信息。
?
?
?
8.url
漏洞描述:
許多開發(fā)人員是用url從一個(gè)頁面向另一個(gè)頁面?zhèn)鬟f信息。由于傳遞的信息是基于文本的,而且他在瀏覽器中是可見的,所以內(nèi)容很容易被篡改。
解決方案:
不在url包含敏感信息。應(yīng)該將所有敏感信息都保存在服務(wù)器中,或者使用加密的格式設(shè)置命該信息并在服務(wù)器上驗(yàn)證返回的結(jié)果。
編碼url,也就是說,把所有參數(shù)都放在同一個(gè)同一個(gè)元素當(dāng)中,在對(duì)此元素內(nèi)的內(nèi)容進(jìn)行編解碼。
?
9.視圖狀態(tài)
漏洞描述:
所有asp.net服務(wù)器空間都保存在一個(gè)叫做_viewstate的隱藏變量中。視圖狀態(tài)信息是以編碼的字符串形式保存在隱藏的變量中。當(dāng)從客戶端向服務(wù)器端發(fā)送信息的過程中,信息有可能被黑客截獲,造成數(shù)據(jù)的泄露。
?
解決方案:
使用ssl加密傳輸過程中的信息。
?
?
10.控制錯(cuò)誤信息
漏洞描述:
處理異常的有效辦法不是向用戶展示任何有關(guān)異常的有用信息,而是將異常記錄到時(shí)間日志中,并顯示一個(gè)能夠像忠實(shí)用戶提供更多可用信息的普通錯(cuò)誤信息。利用這種方式,可防止信息的泄露,也能避免遭到惡意錯(cuò)誤信息的攻擊。
?
解決方案:
使用單獨(dú)的錯(cuò)誤頁面,顯示錯(cuò)誤信息,也就是說當(dāng)程序發(fā)生錯(cuò)誤時(shí),轉(zhuǎn)到已經(jīng)定義好的錯(cuò)誤頁面上去。
?
11.禁用調(diào)試和跟蹤
漏洞描述:
這兩種功能在開發(fā)周期中很重要,但在產(chǎn)品環(huán)境中是沒有意義的。如果開啟調(diào)試和跟蹤有可能暴露重要信息,如數(shù)據(jù)庫的鏈接字符串。
解決方案:
在web.config和iis中關(guān)閉調(diào)試和跟蹤。
?
上述說的是在程序編寫過程中能夠遇到的系統(tǒng)安全性方面的內(nèi)容。
?
?
?
二、部分解決方案
1.1漏洞描述:用戶登錄階段通過破解字典等反復(fù)登錄,用來破解用戶密碼的方式。
1.2解決方案:
?? (1) 使用頁面驗(yàn)證碼,應(yīng)用驗(yàn)證碼是為了防止通過程序方式,自動(dòng)去填寫信息,然后自動(dòng)發(fā)送給web服務(wù)器而欺騙服務(wù)器去其進(jìn)行注冊(cè)或登錄。
?? (2) 限制ip和mac地址,有些圖片驗(yàn)證碼是可以通過破解程序讀取的,所以當(dāng)驗(yàn)證碼失效后,則通過限定ip或mac地址錯(cuò)誤登錄的次數(shù)(當(dāng)某個(gè)ip或mac地址的連續(xù)登錄錯(cuò)誤的次數(shù)超過n次后,則停用此用戶)來限定。
?
2.登錄/注冊(cè)安全
2.1 漏洞描述:用戶登錄或者填寫登錄信息,向服務(wù)器端發(fā)送信息,有可能此信息被截獲,導(dǎo)致用戶的信息暴露。信息暴露分為(1)客戶端信息暴露,如:客戶端有病毒程序,自動(dòng)記錄用戶所填寫信息。(2)客戶端向服務(wù)器端發(fā)送信息途中,信息被截獲。(3)服務(wù)器端有病毒程序或被黑客控制等,客戶信息在服務(wù)器端暴露。
2.2 解決方案:
2.1 客戶端解決方案
?? (1)在頁面上使用虛擬鍵盤,并且鍵盤數(shù)據(jù)生成順序隨即排列。這樣用戶輸入信息只需要點(diǎn)擊鼠標(biāo)即可,這樣可以防止客戶端病毒程序記錄鍵盤所按內(nèi)容。
?
2.2傳輸過程中解決方案
(1)使用https協(xié)議進(jìn)行數(shù)據(jù)的加密傳輸,這樣可以保證在傳輸過程中的安全性。
(2)使用獨(dú)立編寫的客戶端加密程序,在客戶端將所發(fā)送的信息進(jìn)行加密。
(3)使用外部設(shè)備,如加密key進(jìn)行數(shù)據(jù)的加密。如:工行u盾。(原理:用戶唯一身份信息經(jīng)256位高強(qiáng)度加密后以電子證書的形式存入一個(gè)特殊的U盤內(nèi),該U盤只讀且防拷貝,使用時(shí),電腦發(fā)出身份認(rèn)證信息,U盤接收后,將信息導(dǎo)入自身,進(jìn)行解密運(yùn)算后與證書內(nèi)信息配對(duì),配對(duì)成功后返回確認(rèn)信息,整個(gè)解密、配對(duì)過程在U盤內(nèi)部完成。)
?
3.上傳漏洞
漏洞描述:黑客可以利用系統(tǒng)提供的上傳功能,向服務(wù)器中上傳惡意文件。用以控制服務(wù)器或者導(dǎo)致系統(tǒng)信息泄露。
?
解決方案:
?
?
?
?
三、高級(jí)內(nèi)容
?
1. 秘密的存儲(chǔ)位置
系統(tǒng)的一些敏感信息,如數(shù)據(jù)庫的鏈接字符串等。如果存儲(chǔ)的位置不當(dāng),則容易引起數(shù)據(jù)的泄露。如,存儲(chǔ)在頁面中,存儲(chǔ)在后臺(tái)編碼中,存儲(chǔ)在.config中,存儲(chǔ)在受保護(hù)的.config中,存儲(chǔ)在內(nèi)存中,使用散列技術(shù)存儲(chǔ)密碼,使用data protection api 存儲(chǔ)秘密。
?
2. 保護(hù)數(shù)據(jù)庫的訪問權(quán)限。
數(shù)據(jù)庫是最容易受到攻擊的地方,如果對(duì)數(shù)據(jù)的訪問權(quán)限設(shè)置不當(dāng)(權(quán)限過高),或者訪問賬戶泄露,都可造成嚴(yán)重的后果。
?
解決方案:
1.? 數(shù)據(jù)庫賬戶。在給用戶分配數(shù)據(jù)庫權(quán)限是,盡量給最小的權(quán)限,這樣能將分先降到最低。
2.? 限制到數(shù)據(jù)庫的鏈接。保護(hù)數(shù)據(jù)庫最好的方法是不要將其放到公共區(qū),這樣可以保證數(shù)據(jù)庫不能從外部進(jìn)行訪問。
3.將秘密存儲(chǔ)在.net組建中。 用來保護(hù)數(shù)據(jù)庫鏈接最好的方式是將期存儲(chǔ)到.Net組件中或提供服務(wù)的com中。但是有些權(quán)限是可以訪問dll文件的,當(dāng)對(duì)dll文件反編譯后,仍然是可以看到內(nèi)容的。
?
?
3.Asp.net安全架構(gòu)
Asp.net安全架構(gòu)為幾個(gè)關(guān)鍵的安全過程包括身份驗(yàn)證,授權(quán),假冒和加密提供了必須功能
?? 1.身份驗(yàn)證—誰到了那里?訪問站點(diǎn)的用戶身份是什么?
2.授權(quán)—您的許可級(jí)別是什么?訪問站點(diǎn)的用戶是否被授權(quán)他所請(qǐng)求的資源?
3.假冒—您準(zhǔn)備假冒什么角色?用戶可以利用他們的標(biāo)識(shí)、或者asp.net 程序的標(biāo)識(shí)或者一些其他的賬戶訪問這些權(quán)限嗎?
?
轉(zhuǎn)載于:https://www.cnblogs.com/dongguang506/archive/2010/09/16/1828033.html
總結(jié)
以上是生活随笔為你收集整理的代码编写中会遇到的安全性问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: R语言下载气象数据
- 下一篇: 应届生,你如何应付技术关?