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