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