WEB應用安全設計思想 續
安全問題的討論中,我們已經向大家介紹了訪問控制的安全設計核心和信任關系的劃分問題,本文將繼續向大家介紹。
數據與代碼分離的思想是安全設計的原則
最典型的體現數據與代碼分離思想的是模板系統。
比如velocity,在渲染html的時候,程序員可以寫vm模板,一些靜態寫死的內容就是代碼,而通過變量,經過渲染才最終展現的內容則稱之為數據。一個典型的例子如下:
-code--------------------------------------------
test
-------------------------------------------------
代碼與數據如果沒有分離,就會導致代碼混亂,數據變成代碼的一部分去執行。比較常見的例子就是PHP里的SQL寫法:
- -code----------------------------------------------------
- $sql = "SELECT * FROM article WHERE articleid='".$_GET[id]."'";
- ---------------------------------------------------------
如果參數 id 中帶有單引號,就會閉合掉代碼中的單引號,從而導致數據變成代碼執行。
所以這個注射的本質問題還是沒有做好數據與代碼的分離。
比較好的做法是如下java代碼中的使用變量綁定,很好的做到了代碼與數據分離
- -code----------------------------------------------------
- String sql="Insert into table VALUES(?,?)";
- List values = new ArrayList();
- values.add(Integer.toString(id));
- values.add(operator);
- try{
- executeStatement(sql, values);
- result=true;
- }catch(Exception e){
- e.printStackTrace();
- }
- ---------------------------------------------------------
但是并不是說使用了模板系統就一定分離了數據與代碼。
因為在類似“render”或者是“transform”的過程中,往往存在一個將數據進行規范化的過程。這個過程也可能出現問題,從而導致代碼可以混淆數據進行執行。
比較好的做法是,數據中不能包含有在代碼中存在語義的字符。
參考如下例子:
- -code----------------------------------------------------
- Set-Cookie: name=id\r\nP3P: xxxxxxxxxxxxxx\r\n
- ---------------------------------------------------------
紅字部分是用戶的輸入。
在HTTP的標準中,冒號“:”,等號“=”,換行符CRLF“\r\n”,百分號“%”等字符都是有具體的語義的,屬于代碼部分。所以正常的用戶數據中不應該包含有這些字符。
如果出于需求一定要包含怎么辦?按照標準將這些字符全部encode。
在HTTP標準中可以使用urlencode,比如等號就變成了“%3d”。
這樣就做到了代碼與數據的分離。
代碼與數據分離原則的本質還是體現了安全問題是信任問題這一思想。
代碼是否應該信任數據,或者說代碼應該信任怎樣的數據,是這個原則的本質。
在應用中,比較好的例子是json、XSLT,這些方法都比較好的做到了數據與代碼分離,所以在開發中多使用這些比較好的方法,無形中就提高了安全性。
最佳實踐一:Secure By Default
經常可以看到一些權威文檔上推薦使用“default denied”,這就是“Secure By Default”
的一種體現。
“Secure By Default”可以說是一個最佳實踐。在很多時候,這個思想應該上升到戰略的高度。只有真正做到“Secure By Default”,才能保證網站的安全。
因為隨著時間的推移和系統的發展、膨脹,會變得越來越臃腫。一個大系統發展到后期,基本上沒有一個人能了解系統的全部,而變化卻每天都在發生。所以,在這種情況下,只有使用“Secure By Default”的思想來制定安全方案。
白名單往往是實現“Secure By Default”的方法。與黑名單不同,白名單的思想很好的體現了“default denied”。下面以XSS的防御問題舉例。
對于一些HTML的標簽和事件,黑名單的做法是列出危險的標簽和事件,然后禁止他們。
WEB安全的設計思想就像大家介紹完了,希望大家已經掌握了。
【編輯推薦】