Web應(yīng)用開(kāi)發(fā)人員最易犯的九個(gè)安全錯(cuò)誤
Web應(yīng)用程序開(kāi)發(fā)是一個(gè)很寬泛的話題。本文僅討論Web應(yīng)用開(kāi)發(fā)者應(yīng)當(dāng)避免的安全錯(cuò)誤。這些錯(cuò)誤涉及到任何開(kāi)發(fā)者都不應(yīng)當(dāng)忽視的基本安全原則。
開(kāi)發(fā)者應(yīng)當(dāng)注意哪些基本的安全原則?應(yīng)當(dāng)避免哪些安全錯(cuò)誤?為回答這些問(wèn)題,下面的建議可以回答上述問(wèn)題。
自以為是:開(kāi)發(fā)自己的安全方法
有些開(kāi)發(fā)者錯(cuò)誤地認(rèn)為自己的算法或認(rèn)證方法更安全:畢竟黑客從未見(jiàn)識(shí)過(guò)這種方法,所以他們?cè)谄平鈺r(shí)會(huì)更困難。果真如此嗎?
答案是否定的。開(kāi)發(fā)者自己開(kāi)發(fā)認(rèn)證或登錄方法是一個(gè)錯(cuò)誤,因?yàn)樗麜?huì)犯一個(gè)或一些黑客能夠發(fā)現(xiàn)的錯(cuò)誤。開(kāi)發(fā)者應(yīng)當(dāng)依靠現(xiàn)有的經(jīng)過(guò)完全測(cè)試的安全方法,原因在于它們已經(jīng)被安全社團(tuán)反復(fù)測(cè)試過(guò)了。因此,這些方法不太可能包含被開(kāi)發(fā)者忽視的重大安全漏洞。有安全專家指出,任何人都可以發(fā)明一種他們自己無(wú)法破解的加密算法,但要開(kāi)發(fā)一種別人無(wú)法破解的方法就困難多了。所以,開(kāi)發(fā)者還是老老實(shí)實(shí)地用經(jīng)認(rèn)證或安全測(cè)試的方法吧。
粗心大意:直接使用用戶提供的信息訪問(wèn)數(shù)據(jù)庫(kù)
在開(kāi)發(fā)應(yīng)用程序特別是在開(kāi)發(fā)Web應(yīng)用程序時(shí),許多開(kāi)發(fā)者沒(méi)有充分地驗(yàn)證從用戶那兒接收到的輸入數(shù)據(jù)。這種做法存在安全問(wèn)題,因?yàn)樗试S非法的數(shù)據(jù)進(jìn)入客戶的數(shù)據(jù)庫(kù),并且還有更大的安全隱患。不能對(duì)用戶的輸入進(jìn)行驗(yàn)證(無(wú)論是來(lái)自Web還是來(lái)自API)會(huì)導(dǎo)致SQL注入、跨站腳本攻擊、命令劫持、緩沖區(qū)溢出,以及被攻擊者利用的其它Web應(yīng)用程序漏洞。
這種錯(cuò)誤在Web應(yīng)用程序的開(kāi)發(fā)中是最常見(jiàn)的。如果沒(méi)有保護(hù)這些程序,用戶就有可能利用輸入字段將惡意腳本注入到應(yīng)用程序或者訪問(wèn)數(shù)據(jù)庫(kù)的私密數(shù)據(jù)。當(dāng)然,多數(shù)用戶不會(huì)有什么惡意企圖,但開(kāi)發(fā)者必須用防御的心態(tài)和方法來(lái)處理用戶輸入。
開(kāi)發(fā)者不應(yīng)當(dāng)輕易相信用戶輸入,而要在客戶端和服務(wù)器端進(jìn)行雙重驗(yàn)證。否則,就有可能產(chǎn)生嚴(yán)重的漏洞,如:跨站腳本攻擊和SQL注入等。
忽視全局:關(guān)注組件而非整個(gè)系統(tǒng)
大型的開(kāi)發(fā)項(xiàng)目往往是由多個(gè)開(kāi)發(fā)者開(kāi)發(fā)應(yīng)用程序的不同部分,因而開(kāi)發(fā)人員就容易關(guān)注個(gè)別組件。當(dāng)然,如此開(kāi)發(fā)的應(yīng)用程序,其每個(gè)小部分可能很安全,但開(kāi)發(fā)者是否考慮過(guò)整體的安全性?
許多安全問(wèn)題并非產(chǎn)生于組件自身,而是在數(shù)據(jù)和過(guò)程從業(yè)務(wù)進(jìn)程的一部分流動(dòng)到另一部分時(shí)才會(huì)出問(wèn)題。開(kāi)發(fā)者一般都承擔(dān)著一項(xiàng)業(yè)務(wù)進(jìn)程的一部分,并且一般不理解業(yè)務(wù)過(guò)程的其它部分。這種認(rèn)知缺乏會(huì)導(dǎo)致不安全的數(shù)據(jù)傳遞,從而將數(shù)據(jù)暴露給各種攻擊和威脅,如中間人攻擊、數(shù)據(jù)完整性問(wèn)題、信息泄露等。
開(kāi)發(fā)者對(duì)企業(yè)的業(yè)務(wù)服務(wù)有一個(gè)系統(tǒng)的觀點(diǎn)是至關(guān)重要的,只有這樣才能理解所有的組件如何協(xié)作,以及如何保證合并后的應(yīng)用程序的安全。#p#
后期修補(bǔ):在開(kāi)發(fā)后期增加安全功能
有的網(wǎng)站或Web應(yīng)用在構(gòu)建時(shí)并沒(méi)有內(nèi)建安全性。記住:安全并不是以后增加的東西,它應(yīng)當(dāng)是整個(gè)應(yīng)用架構(gòu)的整體功能的一部分。架構(gòu)是應(yīng)用開(kāi)發(fā)的最重要的方面,因?yàn)樗鼤?huì)影響應(yīng)用程序的所有其它方面,其中就包括安全性。
這種錯(cuò)誤的表現(xiàn)(如漏洞和錯(cuò)誤配置)可以追溯到開(kāi)發(fā)階段:開(kāi)發(fā)者最后將安全作為一種額外增加的特性或功能。如有的開(kāi)發(fā)團(tuán)隊(duì)有這樣的認(rèn)識(shí):不錯(cuò),所有的功能都正常運(yùn)行,現(xiàn)在開(kāi)始解決安全性問(wèn)題吧。這種思想會(huì)帶來(lái)應(yīng)用程序架構(gòu)上的安全漏洞從而增加風(fēng)險(xiǎn)。在應(yīng)用程序完全部署后,任何人都很難去解決跨站請(qǐng)求偽造(CSRF)及大量的SQL注入漏洞了。所以,開(kāi)發(fā)者應(yīng)當(dāng)在開(kāi)發(fā)和構(gòu)建Web應(yīng)用程序的整個(gè)生命周期中構(gòu)建安全性。
放任用戶:允許用戶生成弱口令
每當(dāng)有攻擊者破解網(wǎng)站或Web應(yīng)用并暴露用戶口令時(shí),一個(gè)明確的事實(shí)都會(huì)隨之浮出水面:用戶們的安全習(xí)慣太差。例如,用戶們的最常用的口令是“abcde”或“12345678”之類。Web應(yīng)用的開(kāi)發(fā)者不應(yīng)當(dāng)允許用戶創(chuàng)建弱口令。開(kāi)發(fā)者應(yīng)當(dāng)要求用戶的口令達(dá)到足夠的長(zhǎng)度,確保其易于記憶但又難以猜測(cè)(例如,強(qiáng)口令至少應(yīng)當(dāng)包含字母、數(shù)字及特殊字符,長(zhǎng)度達(dá)10個(gè)字符以上)。最好的口令未必是最復(fù)雜的。強(qiáng)迫用戶使用過(guò)度復(fù)雜的口令往往導(dǎo)致用戶一些不安全的做法,例如把口令寫(xiě)下來(lái)然后再貼到電腦的一個(gè)地方。
忽視加密:以純文本存儲(chǔ)用戶口令和數(shù)據(jù)
Web應(yīng)用開(kāi)發(fā)者最常犯的錯(cuò)誤是沒(méi)有保證用戶認(rèn)證憑據(jù)的安全。用戶們想當(dāng)然地認(rèn)為網(wǎng)站或Web應(yīng)用會(huì)做得很安全,但不幸的是,太多的網(wǎng)站或Web應(yīng)用沒(méi)有做好。從總體上說(shuō), Web應(yīng)用或網(wǎng)站在處理和保存口令方式上往往存在漏洞。
問(wèn)題是:怎樣才能正確地保存口令?這里重點(diǎn)談一個(gè)最常見(jiàn)卻很不安全的做法:以明文保存口令。許多大公司也有可能犯這樣的錯(cuò)誤。對(duì)企業(yè)數(shù)據(jù)庫(kù)的任何損害都不應(yīng)當(dāng)使用戶數(shù)據(jù)遭受風(fēng)險(xiǎn),尤其是用戶們使用的口令。因而,企業(yè)的應(yīng)用程序應(yīng)當(dāng)對(duì)用戶的口令和其它細(xì)節(jié)進(jìn)行加密,然后才將其保存在一個(gè)數(shù)據(jù)庫(kù)中。
企業(yè)應(yīng)用的開(kāi)發(fā)者必須思考,在黑客取得企業(yè)數(shù)據(jù)庫(kù)的訪問(wèn)權(quán)時(shí),他們能怎樣輕易地竊取數(shù)據(jù)?如果開(kāi)發(fā)者加密數(shù)據(jù),就會(huì)導(dǎo)致個(gè)人和企業(yè)信息的大量泄露。
僅僅因?yàn)閿?shù)據(jù)庫(kù)引擎要求用戶名和口令并不意味著黑客無(wú)法竊取數(shù)據(jù)文件和獲取其中的信息。數(shù)據(jù)的安全性依賴于數(shù)據(jù)庫(kù)引擎的安全性,如果黑客利用了數(shù)據(jù)庫(kù)引擎的漏洞,就可以輕松地訪問(wèn)數(shù)據(jù)庫(kù)。這正是許多大型游戲和電子商務(wù)網(wǎng)站遭受破解的原因,也是包含信用卡數(shù)據(jù)在內(nèi)的所有個(gè)人信息失竊的原因。#p#
“明修棧道”:通過(guò)URL路徑名傳遞變量
還有一種危險(xiǎn)但常見(jiàn)的做法:許多開(kāi)發(fā)者把變量放在URL中,這會(huì)為黑客打開(kāi)利用其它應(yīng)用或數(shù)據(jù)的大門(mén)。這種錯(cuò)誤的風(fēng)險(xiǎn)非常巨大。
開(kāi)發(fā)者絕對(duì)不能允許用戶與之交互的變量成為文件路徑的一部分。如果URL中包含下載文件的路徑,攻擊者就可以修改URL,使其引用另一個(gè)文件,從而可能下載包含用戶口令的文件。由此,攻擊者用一個(gè)鏈接(例如,該鏈接允許用戶下載應(yīng)用程序的免費(fèi)版)就達(dá)到了利用漏洞的目的。
正所謂開(kāi)發(fā)者“明修”了“棧道”,卻被攻擊者“暗渡”了“陳倉(cāng)”。
顧此失彼:僅在客戶端執(zhí)行授權(quán)
如今,越來(lái)越多的開(kāi)發(fā)者日漸重視客戶端。這種趨勢(shì)會(huì)使應(yīng)用程序更快更強(qiáng)大,但如果開(kāi)發(fā)者不能正確地解決程序的授權(quán)問(wèn)題,就會(huì)帶來(lái)安全隱患。
很多Web應(yīng)用的開(kāi)發(fā)者依賴客戶端的瀏覽器去完成以前在服務(wù)器完成的任務(wù)。從安全的觀點(diǎn)看,這種做法缺少了許多控制,因?yàn)殚_(kāi)發(fā)者并不了解客戶端的種類。客戶端甚至有可能并非瀏覽器。開(kāi)發(fā)者不應(yīng)當(dāng)輕易地相信發(fā)生在客戶端的操作,不應(yīng)當(dāng)僅依賴JavaScript或客戶端代碼來(lái)實(shí)現(xiàn)關(guān)鍵功能,對(duì)于涉及到付款信息和其它敏感信息的功能,尤其要注意。
盲目樂(lè)觀:認(rèn)為自己不可能出問(wèn)題
在開(kāi)發(fā)Web應(yīng)用程序時(shí),開(kāi)發(fā)人員容易犯的錯(cuò)誤是:想當(dāng)然地認(rèn)為自己的應(yīng)用程序不會(huì)遭到攻擊,或者認(rèn)為自己不會(huì)犯錯(cuò)誤。這些想法都會(huì)導(dǎo)致安全問(wèn)題。開(kāi)發(fā)者應(yīng)當(dāng)總是設(shè)想自己的程序會(huì)遭受攻擊,而且自己也會(huì)犯安全方面的錯(cuò)誤。這種思想有助于開(kāi)發(fā)者避免或減少安全風(fēng)險(xiǎn),從而避免公司遭受損失。
誰(shuí)都會(huì)犯錯(cuò)。如果開(kāi)發(fā)者在黑客找到漏洞之前自己先找到了問(wèn)題,問(wèn)題還不算大。在開(kāi)發(fā)者和軟件測(cè)試者測(cè)試和審計(jì)Web應(yīng)用程序時(shí),或在企業(yè)投入使用程序之前,開(kāi)發(fā)者或測(cè)試者不妨使用著名的開(kāi)源工具OWASP ZAP來(lái)掃描企業(yè)的應(yīng)用程序,查找一些常見(jiàn)的漏洞和錯(cuò)誤。
結(jié)束語(yǔ)
此文談到了一些最基本的卻是很重要的一些安全錯(cuò)誤。希望開(kāi)發(fā)者在此基礎(chǔ)上能夠進(jìn)一步發(fā)現(xiàn)和總結(jié)在Web應(yīng)用開(kāi)發(fā)過(guò)程中的其它問(wèn)題,構(gòu)建更堅(jiān)實(shí)的安全保障。