1.7.3 數據與代碼分離原則

1.7.3  數據與代碼分離原則html

另外一個重要的安全原則是數據與代碼分離原則。這一原則普遍適用於各類因爲"注入"而引起安全問題的場景。瀏覽器

實際上,緩衝區溢出,也能夠認爲是程序違背了這一原則的後果--程序在棧或者堆中,將用戶數據當作代碼執行,混淆了代碼與數據的邊界,從而致使安全問題的發生。安全

在Web安全中,由"注入"引發的問題比比皆是,如XSS、SQL Injection、CRLF Injection、X-Path Injection等。此類問題都可以根據"數據與代碼分離原則"設計出真正安全的解決方案,由於這個原則抓住了漏洞造成的本質緣由。編碼

以XSS爲例,它產生的緣由是HTML Injection 或 JavaScript Injection,若是一個頁面的代碼以下:設計

 
  1. <html> 
  2. <head>test</head> 
  3. <body> 
  4. $var  
  5. </body> 
  6. </html> 

其中 $var 是用戶可以控制的變量,那麼對於這段代碼來講:htm

 
  1. <html> 
  2. <head>test</head> 
  3. <body> 
  4.  
  5. </body> 
  6. </html> 

就是程序的代碼執行段。ip

開發

 
  1. $var 

就是程序的用戶數據片斷。io

若是把用戶數據片斷 $var 當成代碼片斷來解釋、執行,就會引起安全問題。test

好比,當$var的值是:

 
  1. <script  src=http://evil></script>  

時,用戶數據就被注入到代碼片斷中。解析這段腳本並執行的過程,是由瀏覽器來完成的--瀏覽器將用戶數據裏的<script>標籤當作代碼來解釋--這顯然不是程序開發者的本意。

根據數據與代碼分離原則,在這裏應該對用戶數據片斷 $var 進行安全處理,可使用過濾、編碼等手段,把可能形成代碼混淆的用戶數據清理掉,具體到這個案例中,就是針對 <、> 等符號作處理。

有的朋友可能會問了:我這裏就是要執行一個<script>標籤,要彈出一段文字,好比:"你好!",那怎麼辦呢?

在這種狀況下,數據與代碼的狀況就發生了變化,根據數據與代碼分離原則,咱們就應該重寫代碼片斷:

 
  1. <html> 
  2. <head>test</head> 
  3. <body> 
  4. <script> 
  5. alert("$var1");  
  6. </script> 
  7. </body> 
  8. </html> 

 

在這種狀況下,<script>標籤也變成了代碼片斷的一部分,用戶數據只有 $var1 可以控制,從而杜絕了安全問題的發生。

相關文章
相關標籤/搜索