Web安全開發規範手冊V1.0

一、背景

團隊最近頻繁遭受網絡攻擊,引起了部門技術負責人的重視,筆者在團隊中相對來說更懂安全,因此花了點時間編輯了一份安全開發自檢清單,覺得應該也有不少讀者有需要,所以將其分享出來。

二、自檢清單

檢查類型 說明 檢查項
輸入驗證 概述 任何來自客戶端的數據,如URL和參數、HTTP頭部、 Javascript戓其他嵌入代碼提交的信息,都屬於不可信數據。在應用外部邊界或內部每個組件或功能邊界,都將其當做潛在的惡意輸入來校驗
白名單 不可信數據可以設定白名單校驗的,應接受所有和白名單匹配的數據,並阻止其他數據
黑名單 不可信數據中包含不良輸入字符時,如空字節(%00)、換行符(%0d,%0a,\r, \n)、路徑字符(../ 或 ..)等,建議直接阻止該數據,若需要接受該數據,則應做不同方式的淨化處理
規範化 不可信數據的淨化和校驗前翯進行規範化,如將目錄遍歷(./或)等相對路徑轉化成絕對路徑URL解碼等。
淨化 不可信數據需實施各種淨化處理時,應徹底刪除惡意字符,只留下已知安全的字符,或者在處理前對它們進行適當編碼或"轉義",如數據輸出到應用頁面時對其進行HTML編碼可防止腳本攻擊
合法性校驗 不可信數據的合法性校驗包括:數據類型如字符.數字、日期等特徵;數據範國;數據長度等
防範SQL注入 不可信數據進入後端數據庫操作前,建議使用正角的參數化查詢來處理,避免出現SQL注入
文件校驗 不可信數據爲解壓縮的文件時,如果文件位於服務目錄外或文件大小超過限制,應拒絕處理
訪問控制 不可信數據通過上述校驗後,還應確認所提交的內容是否與用戶的身份匹配,避免越權訪問
輸出驗證 概述 考慮目標編譯器的安全性,對所有輸出字符進行正確編碼
編碼場景 不可信數據輸出到前後端頁面時,根據輸出場景對其進行相關編碼,如HTML實體編碼、UR編碼
淨化場景 針對操作系統命令、SQL和LDAP查詢,淨化所有輸出的敏感信息,如銀行卡、手機號、系統信息等
身份驗證 概述 所有對非公開的網頁和資源的訪問,必須在後端服務上執行標準的、通用的身份驗證過程
提交憑證 用戶憑據必須經過加密且以POST方式提交,建議用HTPS協議來加密通道、認證服務端
錯誤提示 安全地處理失敗的身份校驗,如使用"用戶名或密碼錯誤"來提示失敗,防止泄露過多信息
異常處理 登錄入口應具有防止暴力或撞庫猜解(利用已泄露的密碼字典進行批量登錄嘗試)的措施,超過1次驗證失敗自動啓用圖靈測試,超過多次驗證失敗自動啓用賬戶鎖定機制限制其訪問
二次驗證 在執行關鍵操作(如賬戶密碼修改、資料更新、交易支付等)時,先啓動圖靈測試,再對用戶身份進行二次驗證。交易支付過程還應該形成完整的證據鏈,待交易數據應經過發起方數字簽名
多因子驗證 高度敏感或核心的業務系統,建議使用多因子身份驗證機制,如短信驗證碼、軟硬件 Token等。
短信驗證 驗證碼生成 複雜度至少6位數字或字母,一次一用,建議有效期不超過180秒。
驗證碼限制 前後端設置用戶獲取頻率爲60秒一次,建議每個用戶每天獲取的短信最多10條
安全提示 增加安全提示:至少含本次操作的功能、驗證碼發送編號、是否是個人自己操作的風險等信息。
憑證校驗 禁止在響應中返回驗證碼,服務器端同時校驗密碼、短信驗證碼等憑證信息,防止出現多階段認證繞過的漏洞。
圖靈測試 驗證碼生成 複雜度至少4位數字或字母,或者採用拼圖等驗證方式,一次一用,建議有效期不超過180秒
驗證碼使用 建議從用戶體驗和安全角度出發,可設計爲當用戶輸錯1次密碼後自動彈出驗證碼輸入框驗證
驗證碼校驗 禁止在響應中返回驗證碼,驗證碼校驗應在服務端進行
密碼管理 密碼設置 密碼設置時,應該滿足8位及以上長度,含大小寫字母、數字及特殊字符等的要求。用戶密碼設置必須經過後端驗,不允許設置不滿定複雜度要求的感密碼。
密碼存儲 用戶密碼存儲時,應採用哈希算法(如SHA1)計算用戶密碼和唯一隨機鹽值(Salt)的摘要值保存其摘要和Sat值,建議分開存儲這兩個值
密碼修改 用戶修改密碼時,修改操作需要通過手機號或者郵箱地均進行一次身份驗證。密碼變更時,應短信或者郵件通知如用戶是否是本人操作,告知其安全風險
密碼找回 用戶密碼找回時,後端需要對註冊手機號或郵箱進行二次驗證,驗證碼和驗證鏈接應發送至預先註冊的地址,並設置有效期以防止暴力破解。密保問題,應當支持儘可能隨機的問題提問。在多個驗證操作中,要對各驗證機制進行排序,以防出現跳過前面驗證機制直接到最後步認證的安全風險
密碼使用 應用開發中禁止設置萬能密碼、硬編碼明文的密 碼、使用數據庫管理員賬戶操作、不同用戶公用賬 戶操作或者將密碼輸出到日誌文件或者控制檯.
會話安全 防止會話劫持 在應用程序進行身份驗證時,建議持續使用HTTPS連接,認證站點使用HTTPS協議。如果連接是從防止會話劫持HTTP跳轉到HTTPS,需要重新生成會話標識符。禁止在HTTP和HTTPS之間來回轉換,這可能會導致會話被劫持
會話標識符安全 設置會話 Cookie時,正確設置" Httponly'屬性(禁止程序加5腳本等讀取 Cookie信息)" Secure'屬性(禁Cookie安全設置止Cookie通過HTTP連接傳遞到服務器端進行驗證);" Domain"屬性(跨域訪問時可指定的授權訪問域名),"Path"屬性(授權可訪問的目錄路徑)。
Cookie安全設置 會話標識符應放置在HTP或HTPS協議的頭信息安全中,禁止以GET參數進行傳遞、在錯誤信息和日誌中記錄會話標識符
防止CSRF攻擊 服務器端執行了完整的會話管理機制,保證每個會防止CSRF話請求都執行了合法的身份驗證和權限控制,防止攻擊發生跨站點請求僞造(CSRF)漏洞。
會話有效期 會話應在平衡風險和功能需求的基礎上設置有效期。定期生成一個新的會話標識符並使上一個會話會話有效期標識符失效,這可以緩解那些因原會活標識符被盜而產生的會話劫持風險。
會話註銷 註銷功能應用於所有受身份驗證保護的網頁,用戶會話註銷登出後應立即清理會話相關信息,終止相關的會話連接
訪問控制 控制方法 將訪問控制的邏輯代碼與應用程序其他代碼分開服務端根據會話標識來進行訪問控制管理。
控制管理 限制只有授權的用戶才能訪問受保護的URL、文件、服務、應用數據、配置、直接對象引用等
接口管理 限制只有授權的外部應用程序或接口才能訪問受保護的本地程序或資源等
權限變更 當權限發生變更時,應記錄日誌,並通知用戶是否是本人操作,告知存在的安全風險
SQL注入 概述 用戶的輸入進入應用程序的SQL操作前,對輸入進行合法性校驗。
參數化處理 用參數化查詢(PHP用PDO,Java用 PreparedStatement,C#用 Sqlparameter)方法對敏感字符如"進行轉義,然後再進行SQL操作。
最小化授權 爲每個應用配置最小化數據庫操作權限,禁止用管理員權限進行數據庫操作,限制操作連接數。
敏感數據加密 敏感信息都採用了加密、哈希或混淆等方式進行保密存儲,降低可能漏洞帶來的數據泄露風險.
禁止錯誤回顯 禁止系統開啓 Debug模式或異常時返回包含敏感信息的提示,建議使用自定義的錯誤信息模板異常信息應存放在日誌中用於安全審計
XSS注入 輸入校驗 對輸入的數據進行過濾和轉義,包含但不限於<>"9%0&+\V"等危險特殊字符
輸出編碼 輸入數據輸出到不同場景中進行不同形式的編碼,如輸出到HTML標籤中則進行HTML編碼輸出到URL中則進行URL編碼,輸出到JS中則行 Script編碼,輸出到 Stylet中則進行CSs編碼
XML注入 輸入校驗 在XML文檔內部或外部引用數據時,過濾用戶提交的參數,如<、>&等特殊字符。禁止加載外部實體,禁止報錯
輸出編碼 建議對XML元素屬性或者內容進行輸出轉義
敏感信息 敏感信息傳輸 敏感信息傳輸時,禁止在GET請求參數中包含敏感信息,如用戶名、密碼、卡號等。建議爲所有敏感信息採用TSL加密傳輸。
客戶端保存 客戶端保存敏感信息時,禁止其表單中的自動填充功能、以明文形式保存敏感信息
服務端保存 服務端保存敏感信息時,禁止在程序中硬編碼敏感信息,明文存儲用戶密碼、身份證號、銀行卡號、持卡人姓名等敏感信息,臨時寫入內存或文件中的敏感數據,應及時清除和釋放
敏感信息維護 敏感信息維護時,禁止將源碼或SQL庫上傳到開源平臺或社區,如 Github、開源中國等。
敏感信息展示 敏感信息展示時,如果是展示在web頁面上,應在後端服務器上進行敏感字段的脫敏處理。
CSRF跨站請求僞造 Token使用 在重要操作的表單中增加會話生成的 Token字段次一用,提交後在服務端校驗該字段
二次驗證 在關鍵表單提交時,要求用戶進行二次身份驗證如密碼、圖片驗證碼、短信驗證碼等
Referer驗證 檢驗用戶請求中 Referer:字段是否存在跨域提交的情況
文件上傳安全 身份校驗 進行文件上傳時,在服務端對用戶的身份進行合法性校驗
合法性校驗 進行文件上傳時,在服務端對文件屬性進行合法性校驗,白名單形式檢查文檔類型(如文件的後緩名、文件頭信息校驗等)和大小(圖片校驗長、寬和像素等)。
存儲環境設置 進行文件保存時,保存在與應用環境獨立的文檔服務器中(配置獨立域名),保存的目錄權限應設置爲不可執行
隱藏文件路徑 進行文件保存時,成功上傳的文件需要進行隨機化重命名,禁止給客戶端返回保存的路徑信息。
文件訪問設置 進行文件下載時,應以二進制形式下載,建議不提供直接訪問(防止木馬文件直接執行)
接口安全 網絡限制 調用方網絡限制,比如通過防火牆、主機host和Nginx deny等技術措施進行校驗。
身份認證 調用方身份認證,比如key、 secret、證書等技術措施進行校驗,禁止共享憑證
完整性校驗 調用的數據安全,對全部參數使用SHA1等摘要運算進行數字簽名,識別數據被篡改
合法性校驗 調用的參數檢查,如參數是否完整,時間戳和Token是否有效,調用權限是否合法等
可用性要求 調用的服務要求,調用滿足等冪性即保持數據一致性,對調用頻率和有效期進行限制
異常處理 調用的異常處理,調用行爲實時檢測,發現異常及時阻攔
I/O操作 共享環境文件安全 在多用戶系統中創建文件時應指定合適的訪問許可,以防止未授權的文件訪問,共享目錄中文件的讀/寫/可執行權限應該使用白名單機制,實現最小化授權。
數據訪問檢查 防止封裝好的數據對象被未授權使用,設置合理的據緩存區大小以防止耗盡系統資源,
應用文件處理 應用程序運行過程中創建的文件,需設置問權限(讀、寫、可執行),臨時文件使及時刪除
運行環境 最小化開放端口 關閉操作系統不需要的端口和服務
後臺服務管理 後臺(如數據緩存和存儲、監控、業務管理等)務限內部網絡訪問,開放在公網的必須設置身份驗證和訪問控制。
環境配置 使用安全穩定的操作系統版本、Web股務器軟件各種應用框架、數據庫組件等
敏感代碼處理 將客戶端敏感代碼(如軟件包簽名、用戶名密碼校驗等)都放在o等軟件包中防止篡改。
關閉調試通道 生產代碼不包含任何調試代碼或接口
通信安全 配置網站的HTTPS證書或其它加密傳輸措施。
異常處理 容錯機制 在應用實現時應包含完整的功能異常捕獲機制如try-catch塊,典型位置:文件、網絡、數據庫、命令操作等。一旦出現異常,應該在日誌中完整記錄異常的發生時間、代碼位置、報錯詳情、觸發錯誤的可能用戶等,重要系統的嚴重異常應該有報警的機制,及時通知系統運營者及時排查並修復題
自定義錯誤信息 在生產環境下,應用程序不應在其響應中返回任何系統生成的消息或其他調試信息,配置應用服務器使其以自定義的方式處理無法處理的應用程序錯誤,返回自定義錯誤信息
隱藏用戶信息 禁止在系統異常時泄露用戶的隱私信息,典型的有:身份信息、個人住址、電話號碼、銀行賬號、通訊記錄、定位信息等
隱藏系統信息 禁止在系統異常時泄露系統的敏感信息(用戶賬戶和密碼、系統開發密鑰、系統源代碼、應用架構、系統賬戶和密碼、網絡拓撲等)。
異常狀態恢復 方法發生異常時要恢復到之前的對象狀態,如業務操作失敗時的回滾操作等,對象修改失敗時要恢復對象原來的狀態,維持對象狀態的一致性
日誌規範 記錄原則 確保日誌記錄包含了重要的應用事件,但禁止保存敏感信息,如會話標識,賬戶密碼、證件等
事件類型 記錄所有的身份驗證、訪問操作、數據變更、關鍵操作、管理功能、登出記錄等事件。
事件要求 日誌一般會記錄每個事件的發生時間、發出請求的IP地址和用戶賬戶(如果已通過驗證)。
日誌保護 日誌受到嚴格保護,避免未授權的讀取或寫入訪問。

三、圖書推薦

如果對筆者的文章較爲感興趣,可以關注筆者新書《PHP Web安全開發實戰》,現已在各大平臺上架銷售,封面如下圖所示

image


作者:湯青松

日期:2018-11-13

微信:songboy8888

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章