top
Loading...
如何使Web更安全
在某種程度上我們可以說,沒有Web,就沒有Internet。可是在大部分情況下,Web應用程序及 Web站點往往易遭受到各種各樣的攻擊,Web數據在網絡傳輸過程中也很容易被竊取或盜用。因此如何能夠使Web及數據傳輸更加安全,是一個應該引起廣泛注意地問題。

從總體情況來看,保護Web站點免受攻擊的最重要的措施就是加強安全意識和提高安全防范措施。

一般情況下,攻擊者攻擊Web的主要目的在于:

1、非法偷窺;
2、偽裝成Web站點的合法訪問者;
3、偽裝成Web站點管理員;
4、試圖控制Web站點主機。

一、 非法偷窺

阻止Web攻擊者監聽行為的最有效方法就是要對Web站點和訪問者之間所建立的連接進行有效加密。幾乎所有的Web瀏覽器和服務器都具備發送和接收加密通道上的數據的能力,這些加密數據被SSL和TLS這兩個相關的協議管理。其中SSL由Netscape產生,TLS與SSL3.0兼容。圖1是微軟公司的IE5.0瀏覽器軟件中的Internet選項,它顯示了有關安全問題的協議。


圖1 IE5.0支持的各種加密協議

Web瀏覽器在連接一般的WEB站點通常使用的是HTTP(超文本傳輸協議),地址欄中URL一般形式為 http://www.somewhere.com。而當Web瀏覽器連接到一個安全站點時,瀏覽器將使用HTTPS (超文本安全傳輸協議)來建立一個加密連接,地址欄中的URL通常的形式為https://www.somewhere.com


為了建立一個安全連接,Web瀏覽器需要首先向Web服務器請求數字證書,數字證書提供了身份證明。瀏覽器在向Web服務器請求它的數字證書時,也同時發送了它所支持的加密算法列表。當服務器回送數字證書和它所選擇的加密算法后,瀏覽器通過檢查數字簽名和確認URL是否與數字證明的公有名字域相匹配來驗證數字證書。如過這些測試失敗,瀏覽器將顯示警告信息。如圖2所示。


圖2 Web服務器對HTTPS的鑒定

瀏覽器和服務器的通訊使用對稱加密。這就意味著使用相同的密鑰來進行加密和解密。當服務器的證書被證實后,瀏覽器將產生一個密鑰,這個密鑰需要通過一個安全的途徑傳遞給服務器。一般使用雙重加密術來完成密鑰的傳遞。瀏覽器使用服務器的公鑰來加密密鑰,然后把它傳遞給服務器。服務器使用它的私鑰來解密密鑰然后向瀏覽器發送確認。

上面的過程表明的就是一個加密連接,瀏覽器和服務器都擁有相同的密鑰,他們使用相同的加密算法。他們后面的通信將使用這個加密的連接。瀏覽器顯示一個黃色的鎖的圖標表示連接已建立。如圖3所示,站點訪問者可以點擊黃色的圖標來檢查服務器的證書,從而核實服務器的身份。

建立一個加密連接,僅需要服務器獲得權威機構(如VeriSign)頒發的證書。但是加密僅能阻止攻擊者看到站點發送
和接收的數據,它并不能阻止攻擊者偽造身份和對站點進行的惡意攻擊。

二、偽裝成Web站點的合法訪問者

現在我們已經知道如何鑒別一個Web站點,但是一個站點如何鑒別它的訪問者呢?下面我們就接著討論這個問題。

大部分Web服務器支持兩個密碼鑒別方案:基本密碼鑒別和分類密碼鑒別。兩個方案都通過向瀏覽器發送鑒別信號來進
行。當瀏覽器第一次收到鑒別信號時,它顯示一個對話框詢問用戶的名字和密碼。在基本鑒別模式中,瀏覽器以簡單的文
本形式來傳遞用戶名和密碼。在分類鑒別模式中,瀏覽器傳送用戶名和密碼的消息類。如果服務器發送它的證實,瀏覽器
就把登錄信息存儲起來。

如果你用Web服務器上的簡單設置來實現這些鑒定方案,Web應用程序中不需要添加任何代碼。

攻擊者的監聽問題:如果訪問者以簡單的文本形式發送他的用戶名和密碼,攻擊者很容易就可捕獲到這些信息。傳送
用戶信息使用SSL可以很容易地解決這個問題。如下面的例子所示。


User ID: < input type="text" name="user" >
Password: < input type="password" name="password">


如果攻擊者不能監聽Web站點和訪問者之間的通信,他將要采取更加卑劣的手段——偽裝成你的合法訪問者。造成這種
情況出現的原因一般是訪問者自己造成的,因為大部分網絡用戶在密碼選取上不是很留心,他們的密碼一般都不是很安
全。他們在登錄各個站點時,喜歡使用相同的用戶名和密碼。

解決這個問題的方法就是訪問者在注冊帳號時要使用安全的密碼。Web站點最好具有能阻止訪問者設置英文單詞作為密
碼的功能,它可以建議用戶使用數字和字母混合而成的密碼。

三、偽裝成Web站點管理員

當訪問者登錄到你的站點時,你將會保持他們的身份一直有效,直到他們離開該站點。那么如何實現這個功能呢?因
為在瀏覽器和服務器之間不會建立一個永久的連接,所以服務器會在收到每個頁面請求后只建立一個單獨的連接。

用戶登錄成功后服務器是如何證實該用戶的身份呢?

答案是瀏覽器保存了用戶的姓名和密碼。當瀏覽器和服務器再次連接時,瀏覽器將傳遞已經存儲過的用戶名和密碼。
服務器利用用戶數據庫來證實這些信息,并會在此基礎上作出允許和拒絕訪問的決定。

前面我們提到過,瀏覽器通過比較帶有服務器的數字證書的公有名字的URL來證實服務器的身份。這是一個很好的Web
安全防范措施。但是它不能避免所有的偽裝服務器的攻擊。

域名服務系統(DNS)可把易讀的網址(例如www.yourunit.com)解析為IP地址,在你的安全鏈接中它是一個易遭受攻
擊的鏈接。如果攻擊者訪問了一個DNS服務器,并且修改了指向他的機器的記錄,那么這個機器就可以把所有來自
www.yourunit.com站點的請求全部重定向到www.attacker.com.。在重定向中,訪問者的瀏覽器將顯示默認的地址后綴。如
果字符串很長,使www.attacker.com不在視野之內,大部分訪問者都不會注意到。

如果攻擊者得到VeriSign為www.attacker.com頒發的數字證書,那么訪問者的瀏覽器將和www.attacker.com建立合法
的連接。如果訪問者不檢查數字證書,他不會知道自己在一個黑客站點上。如果攻擊者把他的站點偽裝成為和
www.attacker.com的登錄界面一樣的話,他就能捕獲到該客戶的銀行信用卡帳號。

四、試圖控制Web站點主機

一些攻擊利用web服務器上運行的軟件的漏洞來讓服務器執行攻擊者的代碼。一類臭名昭著的攻擊方法就是向緩存寫入大量的數據從而使緩存器崩潰。下面所摘錄的一段C++代碼就很容易受到這樣的攻擊,因為它沒有邊界檢查。

void ByYourCommand( char* pszData )
{ char szBuffer[ 255];
strcpy( szBuffer, pszData ); ...}

如果執行strcpy()過程使堆棧溢出,將會產生什么結果呢?圖4向你展示了系統堆棧溢出后的情況。如果攻擊者在緩存中寫入了太多的數據,它將覆蓋函數調用記錄。這是一個數據結構,它包含了保存函數入口代碼的寄存器,還有函數的返回地址。如果攻擊者的代碼覆蓋了函數的返回地址,攻擊者就可以在你的計算機上執行任何代碼。


圖4 通過使緩存溢出,攻擊者把攻擊代碼加載到內存,
代替函數的返回地址,從而執行攻擊代碼

攻擊者是如何把他的攻擊代碼移植到你的電腦上的呢?他使用的方法就是把代碼寫進數據緩存,傳遞這個例子函數的字符串很容易感染上“特洛伊木馬”這樣的黑客程序。有許多文章已經介紹過這類的攻擊方式。

黑客知道易攻擊的函數(例如上面所舉的函數例子)通常易被回應用戶輸入的代碼所調用。攻擊者發送一個不可能的長字符串給服務器。如果緩存溢出,處理他的請求的線程將崩潰。攻擊者得到HTTP超時的消息提示就表明請求線程已被破壞。

如何阻止你Web站點的應用程序被利用呢?首先,給系統軟件添加最新的安全補丁。然后,檢查使用允許直接訪問內存的語言(例如:C、C++和Delphi)編寫的程序代碼,看是否有安全漏洞。

檢查代碼可以給你無盡的信心,因為你可以發現一個應用程序并不是很容易就受到緩存溢出這樣的攻擊的。如果你要完全避免這樣的問題,只能不使用直接訪問內存的語言來編寫代碼。你可以使用一些腳本語言(例如:JavaScript、Perl)或使用解釋性的語言(例如Java)。如果使用安全的語言來編寫代碼,Web站點的操作員就可以被解放出來,不用天天擔心緩存溢出這樣的安全攻擊。

另外,你也不要盲目地相信各種安全技術,廠商雖然為了推銷自己的產品而做出了很好的安全質量承諾,但是你要知道沒有任何技術能夠保證你的Web不遭受攻擊。所以你需要一定的時間和精力去研究和發現Web的缺點,然后找出解決問題的方法。

Web的安全性問題非常復雜,范圍很廣,在本文中,我們只是從外部的攻擊角度出發,討論了如何避免Web應用程序和Web數據遭到破壞和竊取,來防止非法用戶對Web應用程序的越權訪問,提高Web站點的安全性。

北斗有巢氏 有巢氏北斗