軟件研發安全規範

1 安全編碼原則

  1. 保持簡單,程序只實現指定的功能。
  2. 堅持最小權限,把可能形成的危害降到最低。
  3. 默認不信任,採用白名單機制,只放行已知的操做。
  4. 永遠不要相信用戶的輸入,對全部輸入進行前臺和後臺兩次檢查。

2 常見WEB潛在問題

輸入驗證:嵌入到查詢字符串、表單字段、cookie 和 HTTP 頭中的惡意字符串的攻擊。這些攻擊包括命令執行、跨站點腳本(XSS)、SQL 注入和緩衝區溢出攻擊。html

身份驗證:標識欺騙、密碼破解、特權提高和未經受權的訪問。前端

受權驗證:訪問保密數據或受限數據、篡改數據以及執行未經受權的操做。java

配置管理:對管理界面進行未經受權的訪問、具備更新配置數據的能力以及對用戶賬戶和賬戶配置文件進行未經受權的訪問。web

敏感數據:泄露保密信息以及篡改數據。數據庫

會話管理:捕捉會話標識符,從而致使會話劫持及標識欺騙。瀏覽器

加密管理:訪問保密數據或賬戶憑據,或兩者均能訪問。安全

參數操做:路徑遍歷攻擊、命令執行以及繞過訪問控制機制,從而致使信息泄漏、特權提高和拒絕服務。bash

異常管理:拒絕服務和敏感的系統級詳細信息的泄漏。服務器

審覈和記錄:不能發現入侵跡象、不能驗證用戶操做,以及在診斷時出現困難。cookie

3 基本開發安全規範

3.1 跨站點腳本(XSS)防範

XSS的類型:反射型XSS、存儲型XSS、DOM型XSS。

跨站點腳本防範的基本原則:

  1. 一切的輸入/輸出都是有害的,不要信任任何輸入/輸出數據。
  2. 全部傳遞過程都不能保障無侵入,執行前、存儲前、顯示前都要進行「數據清洗」。
  3. 全部的數據校驗、處理工做要在前端和服務器端兩次進行。
  4. 目前全部的XSS經過com.keegoo.core.util.XSSUtil來過濾。

DOM-based XSS的防範當操做頁面中DOM對象的時候,要對其輸入的參數進行處理,防止XSS的注入。可採用escape、encodeURI、encodeURIComponent或自定義方法進行處理。示例:

Window.location=encodeURI(」http://www.dhgate.com」);
複製代碼

對輸入/輸出進行Encode 將輸入/輸出進行轉義成HTML實體編碼(ISO 8859-1 Latin1)或其餘編碼,使得其在瀏覽器中不可自動執行。

不要在html元素和屬性中使用未經轉義的不安全內容。以下面的示例:

<script>...NEVER PUT UNTRUSTED DATA HERE...</script>   
directly in a script 
<!--...NEVER PUT UNTRUSTED DATA HERE...-->             
inside an HTML comment 
<div ...NEVER PUT UNTRUSTED DATA HERE...=test />
in an attribute name 
<NEVER PUT UNTRUSTED DATA HERE... href="/test" />
in a tag name
<div attr=...ESCAPE UNTRUSTED DATA BEFORE PUTTING HERE...>content</div>
inside UNquoted attribute 
<div attr='...ESCAPE UNTRUSTED DATA BEFORE PUTTING HERE...'>content</div>
inside single quoted attribute
<div attr="...ESCAPE UNTRUSTED DATA BEFORE PUTTING HERE...">content</div>
inside double quoted attribute
複製代碼

3.2 防SQL注入規範

  1. 防SQL注入基本原則:全部用戶輸入都必須進行合法性校驗。全部數據庫SQL操做必須參數化
  2. 回收開發人員等操做生產庫權限:減小開發人員、非DBA操做生產庫的權限;數據庫數據查詢要有權限分級和審覈。
  3. 儘可能使用PreparedStatement代替Statement,一方面,在大多數狀況下,使用PreparedStatement的性能將優於使用Statement,另一方面,能夠最大限度的減小SQL注入發生的可能行。
  4. 用戶提交的數據都應該作合法性校驗,避免用戶輸入‘,「「,-,%,#,&,|,@,+等有可能致使SQL注入的危險字符給系統形成危害。

3.3 頁面組件安全防範

  1. 頁面標籤必須關閉,屬性值必須加引號。在頁面中使用的標籤不關閉,屬性值不加引號每每成爲被攻擊點,攻擊者很容易的利用這些漏洞進行注入。避免這些漏洞的出現能夠提升被攻擊的可能。

  2. Form提交方式必須選用POST。Form默認的提交方式是Get,這種方式將表單中數據的按照variable=value的形式,使用「?」添加至Action所指向的URL後面,各個變量之間使用「&」鏈接。所要傳遞的信息量除受URL長度限制以外,信息內容都顯示暴露。

    在使用Form的時候必須將提交方式置爲POST。示例:

    <form action="…" method="post" target="_blank">…</form>
    複製代碼
  3. 全部的非ASCII字符在URL中傳遞時都須要按照協商好的編碼方式作URL編碼。推薦使用encodeURI、encodeURIComponent或者自定義encode實現。encodeURI、encodeURIComponent默認都返回UTF8編碼的URL,區別在於encodeURI方法不會對下列字符進行編碼: ":"、"/"、";" 和 "?"。而encodeURIComponent則會對這些字符進行編碼處理。

  4. 儘可能使用對象的innerText,不要使用innerHtml屬性。對象的innerText屬性默認會對輸入的數據進行encode,使得若是數據的數據還有html可執行標記時不會直接執行,而若是使用innerHtml屬性的話不會保障。

    <SPAN id=」Addr」></SPAN>
    <Script>
        // Using innerText renders the content safe.Addr.innerText=」…」;
        //Using innerHtml requires the use of HtmlEncode to make it 
        safe.Addr.innerHtml=」」;
    </Script>
    複製代碼
  5. 輸入框設置最大長度、輸入數據類型限制。輸入框通常是攻擊者比較鐘意的攻擊對象,攻擊者能夠經過輸入框限制不足的弱點進行數據竊取(好比SQL注入)、或者製造迫害(如比XSS)。咱們能夠經過對輸入框最大長度、輸入數據類型的限制,從必定程度上防範這樣的攻擊。咱們能夠根據實際需求,對一些輸入框限定只容許輸入字母、數字等。同時對輸入的數據長度作限制。

  6. 關閉客戶端自動完成功能,減小駐留在客戶端數據

    <FORM … AUTOCOMPLETE=」OFF」/>
    <INPUT … AUTOCOMPLETE=」OFF」/>
    複製代碼
  7. 設置/受限,防止腳本執行。將/中security屬性設置爲restricted後, Frame中的腳本將不能執行(僅限於IE)。

    3.4 敏感數據的安全防範

    1. 不能任意在Cookie、Session、ServletContext中存放數據,對於這些對象中存放的數據,必須有統必定義、說明、Lifecycle的管理等。

    2. 對於敏感信息都必須保障其私密性。在頁面顯示、操做交互中不可避免的會有一些如用戶的標識信息、密碼、賬號信息、涉及的金額信息等敏感數據(保密性的數據)的存在。爲保障這些數據不被曝露而提升安全性,咱們要作到全部敏感信息必須進行加密處理,不能以明文的形式存在於任何網絡、內存及其它持久化介質中(如:數據庫、文件磁盤系統等)。

    3. 全部的密碼、key、賬號等機密信息都不能在URL中傳遞。

    4. 全部的密碼、key、銀行帳號等機密信息都不能存儲到Cookie,Session、ServletContext中。

    5. 防止信息泄漏:

      1. 在系統上線使用的log level對應的日誌輸出中不容許包含任何密碼、key、帳號等機密信息。
      2. SVN集成分支上的代碼中不容許存留可用的system.out/err.print語句。
      3. 在測試/調試階段所使用的測試頁面、單元測試模塊等不容許提交到SVN集成分支上。
      4. 不容許將系統產生的錯誤異常信息直接顯示給用戶,須要有統一的錯誤處理。
    6. 儘可能減小沒必要要的信息傳遞。在信息的傳遞過程當中,若是當前Step中的對象、對象的屬性、參數等在下一個Step中不須要,則不要再作傳遞,甚至能夠顯式的銷燬。這樣能夠有效的減小信息被截獲的機率,特別是敏感數據(例如用戶密碼、帳戶信息等等)。

    3.5 WEB安全防範

    1. Cookie的安全防範:

      1. 存儲於cookie中的敏感數據必須加密。
      2. 沒有特殊要求下,儘可能使用會話cookie(非持久化)。
      3. 若是使用持久化cookie應該設置cookie超時。
      4. 激活cookie安全傳輸,表示建立的 cookie 只能在https鏈接中被瀏覽器傳遞到服務器端進行會話驗證,若是是http鏈接則不會傳遞該信息。
      Cookie[] cookies = request.getCookies();
      for(Cookie cookie : cookies) {
          if (…) {
              // 設置cookie不持久化到客戶端磁盤上
              cookie.setMaxAge(-1);
              // 設置cookie超時, 120秒
              cookie.setMaxAge(120);
              // 激活cookie安全傳輸
              cookie.setSecure(true);
              response.addCookie(cookie);
          }
      }
      複製代碼
    2. 必須設置session的超時時間。web.xml中配置示例:

      <session-config>
          <session-timeout>10</session-timeout>
      </session-config>複製代碼
    3. 必須構建統一的錯誤處理頁面。web.xml示例:

      <error-page>
          <error-code>500</error-code>
          <location>/error.jsp</location>
      </error-page>
      複製代碼
    4. 多線程中線程安全的防範:

      1. 儘可能少用靜態(static)變量和static方法。(除了靜態常量:static final constants)。
      2. 儘可能多線程框架(java.util.concurrent)構建多線程同步機制。
      3. 使用ThreadLocal避免多個線程之間類成員的共享衝突。
      4. 如非必要,不要使用synchronized關鍵字。必需要使用synchronized時,應將同步範圍最小化,即將同步做用到最須要的地方,避免大塊的同步塊或方法等。
    5. 增長Referer的檢查,防止非法訪問。Referer是HTTP Header中的一個字段,當瀏覽器想服務器發送請求時,Referer用來通知服務器請求發起的位置。

相關文章
相關標籤/搜索