2015-07-20 56 views
0

背景檢查防止注入攻擊的所有參數是否是一種很好的做法?

  • 基於應用:Spring MVC的
  • Java8
  • 大多使用攔截器過濾請求了。

問題

我測試我的應用程序和每一個用戶輸入很容易受到HTML /腳本注入攻擊。我使用了某些方法來阻止他們在我的客戶端,但是如果我在表單值被髮布到服務器之前操作了這些表單值,那麼注入成功並損壞了我的網站。那麼我的首要任務就是在服務器端使用相同的檢測方法。我應該這樣做早期的教,但有一些原因,反正...

就是我的

思維是檢查一個攔截器的每個參數。攔截器將驗證頁面提供用戶輸入和表單提交的所有參數。

像這樣

public class ParameterFilteringInterceptor { 
    // 1. get all request parameters.. 
    // 2. check every values.. 
    // 3. if illegal characters exist in one of them, 
    // converting or escaping them will start and change them to acceptable values. 

    // Getting and setting on request parameters is going to occur frequently. 

    // If good to go, return true 
    // Or return false with a proper error message. 
} 

SETUP喜歡這個

<interceptor> 
     <mapping path="/addform" /> 
     <mapping path="/editform" /> 
     <mapping path="/post" /> 
     <mapping path="/newarticle" /> 
     <mapping path="/newcomment" /> 
      . 
      . 
      . 
      <!-- Depend on the volume of a web application, 
      these mapping paths could be sooooooooo many. --> 
     <beans:bean class="com.company.web.interceptor.AuthenticatingInterceptor"></beans:bean>   
    </interceptor> 

所以..我要問的是什麼.. 「這是一個好主意做上面的事情嗎?「

+1

作爲一個慣例,是的,你應該驗證請求中的每個參數,因爲它不能假定請求來自人類通過驗證的UI。您可以使用HDIV等經過驗證的框架,而不是使用自定義驗證。 – manish

+1

爲什麼不通過JSR303註釋驗證模型中的所有輸入。你將不得不編寫更少的代碼。如果您使用的是Spring表單標記,則輸入數據直接進入模型的驗證位置,然後在控制器方法中,如果出現錯誤,則表單頁面在沒有錯誤的情況下重新顯示,然後輸入過程完成。 – underdog

+2

要在每個參數上做到這一點,不管**參數**的含義可能是錯誤的。它可能適用於簡單的情況,但理想情況下,您應該根據語義清理輸入內容。如果你輸入的是HTML頁面上顯示的內容,你想要去掉<<字符。如果你的輸入是一個數學公式,你可能不會。 – biziclop

回答

3

試圖逃跑或以其他方式拒絕cross-site scripting (XSS)嘗試提交不是一個好主意。這種方法有幾個問題:

  • 轉義用戶輸入的正確方法取決於您要注入的位置。使用不當轉義的內容可能會導致顯示問題 - 用戶看到垃圾 - 或意外的XSS漏洞。
  • 因爲您的用戶內容已經被轉義顯示,您必須避免再次轉義。這意味着您必須在模板中以不同方式處理來自數據庫的用戶輸入和來自其他來源的用戶輸入,否則您將得到與上面相同的問題。
  • 當您不想使用它來顯示時,數據庫中的轉義內容需要特殊處理,因爲您需要忽略它。這增加了不必要的樣板代碼,降低了互操作性,並可能導致錯誤。
  • 很難合法XSS攻擊,無害化利用保留的字符,如<,>區分,「或」,方法,如標籤剝離(即除去一切看起來像HTML標籤)可以破壞用戶的內容。

相反,只要顯示,您應該立即跳過您的內容。這裏有一個pretty good writeup,詳細闡述了爲什麼逃避投入是一個壞主意。

Spring支持的模板框架具有轉義內容的快捷方式。個人而言,我建議使用Thymeleaf:默認情況下,它會跳過用戶輸入的HTML內容和屬性 - 否則需要使用specific Thymeleaf attribute - 它有shortcuts for escaping input用於在頁面中嵌入的JavaScript或JSON(請參見下方) 。

如果您正在使用其他模板框架(或JSP),請參閱其文檔以瞭解如何在顯示中轉義內容。請注意,某些模板框架默認情況下不會轉義和/或不提供不同的轉義方法。前者可能導致XSS漏洞,當您忘記在某處輸入輸入時,後者的後果已在上文中描述。

+1

+1。輸入過濾(刪除不想要的字符,如控制字符)和驗證(確保輸入符合預期的業務規則格式)有很好的用處,但輸入階段不是考慮轉義/注入問題的地方。 – bobince

相關問題