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