先決條件: | 基本的計(jì)算機(jī)素養(yǎng)。 |
---|---|
目的: | 了解對(duì)Web應(yīng)用程序安全最常見(jiàn)的威脅,以及您可以如何降低網(wǎng)站被黑客入侵的風(fēng)險(xiǎn)。 |
互聯(lián)網(wǎng)是一個(gè)危險(xiǎn)的地方! 我們非常規(guī)律地聽(tīng)說(shuō)由于拒絕服務(wù)攻擊或在其主頁(yè)上顯示修改(和經(jīng)常損壞)的信息,網(wǎng)站不可用。 在其他高調(diào)案例中,數(shù)百萬(wàn)個(gè)密碼,電子郵件地址和信用卡詳細(xì)信息已泄漏到公共領(lǐng)域,從而使網(wǎng)站用戶(hù)面臨個(gè)人尷尬和財(cái)務(wù)風(fēng)險(xiǎn)。
網(wǎng)站安全的目的是防止這些(或任何)類(lèi)型的攻擊。 更正式地,網(wǎng)站安全是保護(hù)網(wǎng)站免受未經(jīng)授權(quán)的訪問(wèn),使用,修改,破壞或中斷的行為/實(shí)踐。
有效的網(wǎng)站安全性需要整個(gè)網(wǎng)站的設(shè)計(jì)工作:在您的Web應(yīng)用程序中,在Web服務(wù)器的配置中,在您的策略中創(chuàng)建和更新密碼,以及在客戶(hù)端代碼。 雖然這一切聽(tīng)起來(lái)很不祥,但好消息是,如果你使用的是服務(wù)器端的網(wǎng)絡(luò)框架,它幾乎肯定已經(jīng)啟用了健壯和周密的防御機(jī)制來(lái)對(duì)抗一些更常見(jiàn)的攻擊"默認(rèn) "。 可以通過(guò)Web服務(wù)器配置減輕其他攻擊,例如啟用HTTPS。 最后,有公共可用的漏洞掃描程序工具,可以幫助你找出是否你犯了任何明顯的錯(cuò)誤。
本文的其余部分提供了有關(guān)一些常見(jiàn)威脅的更多詳細(xì)信息,以及您可以采取的一些簡(jiǎn)單步驟來(lái)保護(hù)您的網(wǎng)站。
注意:這是一個(gè)介紹性主題,旨在幫助您開(kāi)始考慮網(wǎng)站安全性。 這不是詳盡無(wú)遺。
本節(jié)列出了幾個(gè)最常見(jiàn)的網(wǎng)站威脅以及如何緩解這些威脅。 在閱讀時(shí),請(qǐng)注意,當(dāng)Web應(yīng)用程序信任或?qū)g覽器發(fā)送的數(shù)據(jù)不夠偏執(zhí)時(shí),威脅是如何成功的!
XSS是用于描述允許攻擊者通過(guò)網(wǎng)站將客戶(hù)端腳本注入到其他用戶(hù)的瀏覽器中的一類(lèi)攻擊的術(shù)語(yǔ)。 由于注入的代碼從站點(diǎn)到瀏覽器是可信的,因此可以進(jìn)行諸如將用戶(hù)的站點(diǎn)授權(quán)cookie發(fā)送給攻擊者的事情。 一旦攻擊者有cookie,他們可以登錄到一個(gè)網(wǎng)站,就像他們是用戶(hù),并做任何用戶(hù)可以。 根據(jù)網(wǎng)站的不同,這可能包括訪問(wèn)其信用卡詳細(xì)信息,查看聯(lián)系方式,更改密碼等。
注意:XSS漏洞歷史上比任何其他類(lèi)型更常見(jiàn)。
有兩種主要方法讓網(wǎng)站將注入的腳本返回到瀏覽器 - 這些被稱(chēng)為反映的 和持久性 XSS漏洞。
http://mysite.com?q=beer<script%20src="http://evilsite.com/tricky.js" rel="external nofollow" ></script>
) and email it to another user. If the target user clicks this "interesting link", the script will be executed when the search results are?displayed. As discussed above, this gives the?attacker all the information they need?to enter the site as the target user?— potentially making purchases as the user or sharing their contact information.POST
or GET
data is the most common source of XSS vulnerabilities, any data from the browser is potentially vulnerable (including?cookie data rendered by the browser, or user files that are uploaded and displayed).對(duì)XSS漏洞的最好防御是刪除或禁用任何可能包含運(yùn)行代碼的指令的標(biāo)記。 對(duì)于HTML,包括< script>
,< object>
,< embed>
,< link>
。
修改用戶(hù)數(shù)據(jù)以使其不能用于運(yùn)行腳本或以其他方式影響服務(wù)器代碼的執(zhí)行的過(guò)程稱(chēng)為輸入清理。 默認(rèn)情況下,許多Web框架會(huì)自動(dòng)從HTML表單中清理用戶(hù)輸入。
SQL注入漏洞使惡意用戶(hù)可以在數(shù)據(jù)庫(kù)上執(zhí)行任意SQL代碼,從而允許無(wú)論用戶(hù)權(quán)限如何訪問(wèn),修改或刪除數(shù)據(jù)。 成功的注入攻擊可能欺騙身份,創(chuàng)建具有管理權(quán)限的新身份,訪問(wèn)服務(wù)器上的所有數(shù)據(jù),或銷(xiāo)毀/修改數(shù)據(jù)以使其不可用。
如果傳遞給基礎(chǔ)SQL語(yǔ)句的用戶(hù)輸入可能更改語(yǔ)句的含義,則會(huì)出現(xiàn)此漏洞。 例如,考慮下面的代碼,用于列出從HTML表單提供的具有特定名稱(chēng)( userName
)的所有用戶(hù):
statement = "SELECT * FROM users WHERE name = '" + userName + "';"
如果用戶(hù)輸入真實(shí)姓名,這將按預(yù)期工作。 但是,惡意用戶(hù)可以通過(guò)為 userName
指定"粗體"文本,將此SQL語(yǔ)句的行為完全更改為以下新語(yǔ)句。 修改語(yǔ)句創(chuàng)建一個(gè)有效的SQL語(yǔ)句,刪除 users
表,并從 userinfo
表中選擇所有數(shù)據(jù)(顯示每個(gè)用戶(hù)的信息)。 這是因?yàn)樽⑷氲奈谋镜牡谝徊糠? a\';
)完成原始語(yǔ)句(\'是在SQL中分隔字符串文字的符號(hào))。
SELECT * FROM users WHERE name = 'a';DROP TABLE users; SELECT * FROM userinfo WHERE 't' = 't';
避免此類(lèi)攻擊的方法是確保傳遞到SQL查詢(xún)的任何用戶(hù)數(shù)據(jù)不會(huì)更改查詢(xún)的性質(zhì)。 要實(shí)現(xiàn)此目的,一種方法是對(duì)用戶(hù)輸入中具有特殊含義的所有字符轉(zhuǎn)義 SQL。
注意:SQL語(yǔ)句將字符視為字符串文字的開(kāi)頭和結(jié)尾。 通過(guò)在前面加上反斜杠,我們"轉(zhuǎn)義"符號(hào)(\\\'),并告訴SQL改為將其視為一個(gè)字符(只是字符串的一部分)。
在下面的語(yǔ)句中,我們轉(zhuǎn)義了\'字符。 SQL現(xiàn)在會(huì)將該名稱(chēng)解釋為以粗體顯示的整個(gè)字符串(確實(shí)是一個(gè)非常奇怪的名稱(chēng),但不是有害的!)
SELECT * FROM users WHERE name = 'a\';DROP TABLE users; SELECT * FROM userinfo WHERE \'t\' = \'t';
Web框架通常會(huì)為您處理這種轉(zhuǎn)義。 例如,Django確保傳遞到查詢(xún)集(模型查詢(xún))的任何用戶(hù)數(shù)據(jù)都被轉(zhuǎn)義。
注意:本部分主要參考維基百科中的信息。
CSRF攻擊允許惡意用戶(hù)在沒(méi)有該用戶(hù)的知識(shí)或同意的情況下使用另一用戶(hù)的憑證來(lái)執(zhí)行動(dòng)作。
這種類(lèi)型的攻擊最好由例子解釋。 John是一位惡意用戶(hù),他知道某個(gè)網(wǎng)站允許已登錄的用戶(hù)使用包含帳戶(hù)名稱(chēng)和金額的HTTP POST
請(qǐng)求將款項(xiàng)匯入指定的帳戶(hù)。 John構(gòu)建了一個(gè)表單,其中包含其銀行詳細(xì)信息和一筆金額作為隱藏字段,并通過(guò)電子郵件將其發(fā)送給其他網(wǎng)站用戶(hù)(將提交按鈕偽裝為"快速致富"網(wǎng)站的鏈接) 。
如果用戶(hù)點(diǎn)擊提交按鈕,系統(tǒng)會(huì)向服務(wù)器發(fā)送HTTP POST
請(qǐng)求,其中包含交易詳情和瀏覽器與網(wǎng)站相關(guān)聯(lián)的任何客戶(hù)端Cookie ( 將相關(guān)網(wǎng)站Cookie添加到請(qǐng)求是瀏覽器的正常行為)。 服務(wù)器將檢查cookie,并使用它們來(lái)確定用戶(hù)是否登錄并且有權(quán)進(jìn)行事務(wù)。
結(jié)果是,當(dāng)用戶(hù)在登錄到交易站點(diǎn)時(shí)點(diǎn)擊提交按鈕的將進(jìn)行交易。 約翰變得富有!
注意:這里的訣竅是,John不需要訪問(wèn)用戶(hù)的Cookie(或訪問(wèn)憑據(jù)) - 用戶(hù)的瀏覽器存儲(chǔ)此信息,并自動(dòng)將其包含在對(duì)相關(guān)服務(wù)器的所有請(qǐng)求中 。
防止這種類(lèi)型的攻擊的一種方式是服務(wù)器要求 POST
請(qǐng)求包括用戶(hù)特定的網(wǎng)站生成的秘密(該秘密將由服務(wù)器在發(fā)送用于制作的網(wǎng)絡(luò)表單時(shí)提供 轉(zhuǎn)移)。 這種方法阻止John創(chuàng)建自己的表單,因?yàn)樗仨氈婪?wù)器為用戶(hù)提供的秘密。 即使他發(fā)現(xiàn)了秘密并為特定用戶(hù)創(chuàng)建了一個(gè)表單,他也不能再使用該表單來(lái)攻擊每個(gè)用戶(hù)。
Web框架通常包括這樣的CSRF預(yù)防機(jī)制。
其他常見(jiàn)的攻擊/漏洞包括:
<iframe>
controlled by the attacker. It could alternatively be used to get the user to click a button on a visible site, but in doing so actually unwittingly click a completely different button. As a defence your site can prevent itself from being embedded in an iframe in another site by setting appropriate HTTP headers.../../
). The solution is to sanitize input before using it.還有更多。 有關(guān)完整的列表,請(qǐng)參閱類(lèi)別:Web安全漏洞(維基百科)和 external">類(lèi)別:攻擊(打開(kāi)Web應(yīng)用程序安全項(xiàng)目)。
當(dāng)Web應(yīng)用程序從瀏覽器信任數(shù)據(jù)時(shí),前面幾節(jié)中的幾乎所有漏洞都會(huì)成功。 無(wú)論您為提高網(wǎng)站安全性做了什么,您都應(yīng)該清理所有用戶(hù)發(fā)起的數(shù)據(jù),然后在瀏覽器中顯示,在SQL查詢(xún)中使用,或傳遞到操作系統(tǒng)或文件系統(tǒng)調(diào)用。
重要提示:您可以了解有關(guān)網(wǎng)站安全性的最重要的一個(gè)教訓(xùn)是不要信任來(lái)自瀏覽器的數(shù)據(jù)。 這包括網(wǎng)址參數(shù), POST
數(shù)據(jù),HTTP標(biāo)頭和Cookie,用戶(hù)上傳的文件等中的 GET
請(qǐng)求數(shù)據(jù)。始終檢查和清理所有傳入的數(shù)據(jù)。 總是假設(shè)最壞的。
您可以采取的其他一些具體步驟有:
POST
data and header information are all much less available to attackers.Web框架可以幫助減輕許多更常見(jiàn)的漏洞。
本文已解釋了網(wǎng)絡(luò)安全的概念,以及您的網(wǎng)站應(yīng)該嘗試保護(hù)的一些更常見(jiàn)的威脅。 最重要的是,您應(yīng)該明白,Web應(yīng)用程序不能信任來(lái)自Web瀏覽器的任何數(shù)據(jù)! 所有用戶(hù)數(shù)據(jù)應(yīng)在顯示之前進(jìn)行清理,或在SQL查詢(xún)或文件系統(tǒng)調(diào)用中使用。
這是此模塊的結(jié)束,涵蓋您在服務(wù)器端網(wǎng)站編程中的第一步。 我們希望您喜歡學(xué)習(xí)基本概念,現(xiàn)在您可以選擇一個(gè)Web框架并開(kāi)始編程。
更多建議: