Web項目開發中常見安全問題防範
計算機程序主要就是輸入/輸出,安全問題由此產生,凡是有輸入的地方都可能帶來安全風險。根據輸入的數據類型,web應用主要有數值型、字符型、文件型。
要消除風險就要對輸入的數據進行檢查,對於web應用來說,檢查的位置主要是前端和後端。前端檢查只能防止正常狀況,沒法防止使用工具、程序繞開檢查直接把數據發送給服務器。
輸入檢查
防止輸入註入型攻擊。所有的輸入數據都要檢查,除了前端檢查外,為防止使用工具、程序繞開前端檢查直接把數據發送給服務器,後端也要檢查所有輸入數據。
依據產品文檔的要求進行合法性檢查,數值型,手機號,時間,郵箱等;
檢查文本型是否含控制字符,過濾掉控制字符;
檢查文本型的長度;
URL字符串轉義,使用 urlencode 函數處理;
文件上傳
防止文件註入型攻擊。
1、文件上傳目錄設置成不可執行;
2、判斷文件類型。結合MIME type與文件擴展名,設置文件類型白名單。對於圖片文件,可以利用圖片庫函數深層次檢查是否真是圖片;
3、重命名文件名;
4、文件服務器使用獨立的域名;
輸出轉義
防止XSS(跨站腳本攻擊)。向頁面輸出的文本型數據進行 html encode(轉義),即是將一些 html 中的特殊字符轉義成普通字符,比如 & 轉義成 &,< 轉義成 <,"與"都要轉義。對應的函數:javascriptencode,php的htmlentities。
同理xml數據包裏的字符串值使用xmlencode,json數據包的字符串值使用jsonencode轉義。
XSS處理
XSS的本質是HTML註入,用戶輸入的數據被當成Html代碼執行了。
1、cookie 使用 HttpOnly 限制
使得在客戶端的js代碼不能讀取cookie值,但是不能防止從 HTTP header裏得到 cookie 值。
2、輸出文本 HTML 轉義
對網頁上顯示的文本內容使用 HtmlEncode 轉義。js函數:OWASP ESAPI中的encodeCharacter。其它的如xmlencode、jsonencode等轉義函數。
3、檢查輸入的URL
輸入的 url 添加上 http: 或者 https:,然後轉義輸出到網頁端
4、對傳入js函數的文本型參數值進行 javascript 轉義
先進行javascript轉義再進行HTML轉義
5、SQL註入
預防方法:數據與代碼分離,即不用字符串拼湊SQL語句,使用SQL預處理方法(參數使用占位符?);
6、XST處理
XST(跨站追蹤)攻擊,關閉Web服務器的TRACE方法;
7、CSRF攻擊的防禦
通常需要防禦CSRF(Cross-Site Request Forgeries)攻擊的頁面是用戶登錄、修改/刪除確認、訂單確認等添加新數據、修改數據的頁面,此外此類頁面必須使用 POST 方式提交。
簡要描述:
CSRF(跨站/域請求偽造)攻擊可以在受害者毫不知情的情況下以受害者名義偽造請求發送給受攻擊站點,從而在並未授權的情況下執行在權限保護之下的操作;
解決方法:
使用驗證碼(安全性最強,但影響用戶體驗,不建議使用);
使用同步隨機token(安全性強);
在一個請求中分別在 cookie 和 post 請求數據中提交session id 並在服務端做比對(安全性較強);
檢查 http 請求中 referer 的值(安全性偏強);不在 URL 中暴露 SessionId 的值,sessionId僅存在cookie中,此外為了增強安全性,在用戶登錄成功後生成一個新的 SessionId 的值;
8、HTTP頭註入
替換HTTP頭字符值中的換行符;
9、Cookie安全
Cookie 僅保存 SessionId 的值,設置HttpOnly屬性為On;
10、用戶密碼安全
使用安全的bcrypt替代MD5,bcrypt會產生隨機鹽 salt
11、權限控制
①.SSO單點登錄,openId系統;
②.Spring Security的實現 - 基於角色的訪問控制(Role-Based Access Control)RBAC;
③.基於數據的訪問控制。比如將用戶Id、對象id修改成另一個存在的id,如果沒有檢查當前登錄用戶是否是參數對應的id用戶,就會產生修改別的用戶數據的問題,也即是越權訪問;
④.OAuth授權。OAuth第三方開源庫;
⑤.SessionId。sessionId加密處理;
Web項目開發中常見安全問題防範