跳轉到內容

網路應用程式安全指南/雜項

來自華夏公益教科書

雜項

本節包含一些關於網路應用程式的一般安全提示。

始終牢記

  • 不要依賴 Web 應用防火牆來保證安全(但是,考慮使用它們來提高安全性)
  • 如果使用外部庫(例如用於資料庫訪問、XML 解析),請始終使用最新版本
  • 如果需要隨機數,請從安全/加密的隨機數生成器中獲取
  • 對於每次操作或資料檢索,始終檢查訪問許可權
  • 在任何情況下,不要嘗試自己實現加密演算法。使用高階庫進行加密。
  • 確保除錯輸出和錯誤訊息不會洩漏敏感資訊
  • 在程式碼中標記有問題的除錯輸出(例如 //TODO DEBUG REMOVE),即使您打算在測試後立即刪除它
  • 不要使用“eval()”和類似函式
    • 儘可能避免使用“system()”和類似函式
  • 確保資料庫伺服器無法從外部直接訪問
  • 考慮阻止舊瀏覽器使用您的應用程式

原理

Web 應用防火牆(WAF)可以防止現有安全漏洞被利用。它們會使攻擊您的網路應用程式變得更加困難和煩人,從而增加非目標攻擊者轉向其他目標的可能性。但是,它們通常可以被有決心的攻擊者繞過。您真正的防禦是保護您的應用程式。WAF 旨在提供一些額外的保護,以防止在執行此操作時出錯。擁有 Web 應用防火牆並不意味著您可以忽略保護應用程式的安全。未針對特定應用程式精確調整的 WAF 通常會阻止合法請求,同時放行攻擊/允許繞過。這對於經常使用的 mod_security 的免費核心規則集尤其如此。

過時的庫版本可能包含安全問題。

如果使用低質量的隨機數,例如用於生成密碼重置令牌,攻擊者可能能夠猜測其值並繞過安全措施。

不在每一步都檢查訪問許可權會導致嚴重的漏洞,例如使用者可以檢視他們無權檢視的資料(例如,會員資料庫應該顯示已登入會員的資訊,更改 URL 中的 ID 由於缺少檢查,會導致其他成員的資訊洩露)。

加密非常複雜,即使是加密專家也很難避免或發現錯誤。安全的密碼是由多個專家經過數月的努力開發,並由數百位專家審查的。不要嘗試發明安全的密碼。也不要嘗試實現現有的密碼,因為錯誤可能不會被發現,並會導致您的結果不安全。使用現有的、可靠的庫。

除錯輸出和錯誤訊息可以為攻擊者提供有價值的資訊。值得注意的是,有多個例項證明以下形式的除錯輸出損害了安全性:“提供的令牌 1234 無效,預期值為 5678”(攻擊者獲得了正確的答案,他只需要在下一次嘗試中提供它)。對於生產版本,通常應該抑制錯誤訊息的顯示。考慮替換 HTTP 錯誤頁面,以隱藏路徑等基本資訊。

標記任何應該刪除的除錯輸出,以確保您不會忘記刪除它,只需在釋出前搜尋“TODO”和“REMOVE”即可。養成始終標記它的習慣,即使您打算“立即”刪除它。您可能隨時會分心並忘記。

透過“eval()”和類似函式使用動態程式碼通常是不必要的,微小的錯誤往往會導致程式碼注入問題。因此,應該避免這些危險的函式。這同樣適用於“system()”,但是,這並非總是可以避免。如果使用,則必須正確轉義“system()”的輸入,當然,可以使用現有的 shell 轉義函式或自動轉義引數的函式。

保持資料庫伺服器無法從外部訪問,例如,如果它們與網路應用程式執行在同一臺機器上,則將其繫結到 127.0.0.1,或者使用具有 IP 白名單的防火牆,可以防止攻擊者使用竊取的資料庫密碼來實際訪問資料庫。

不再受供應商支援的瀏覽器往往存在嚴重的安全問題。它們是客戶維護不良的標誌,很容易受到惡意軟體攻擊,並且通常缺少與網路應用程式相關的安全功能。可以使用 User-Agent 標頭進行阻止,或者對於 IE 使用條件註釋。阻止過時的瀏覽器可以迫使客戶端使用安全瀏覽器;但是,它可能會阻止無法更新瀏覽器的使用者使用應用程式。除非您知道所有客戶端都應該使用 IE8 或更高版本,否則不建議阻止比 IE6 新的任何內容。請注意,Mozilla Firefox 3.6.x 分支仍然受支援(截至 2011 年 9 月),而 Firefox 4 分支不受支援。顯然,有意阻止舊瀏覽器主要與需要非常高安全性的網路應用程式相關。

華夏公益教科書