計算機程序主要就是輸入/輸出佳魔,安全問題由此產生,凡是有輸入的地方都可能帶來安全風險晦炊。根據(jù)輸入的數(shù)據(jù)類型吃引,web應用主要有數(shù)值型、字符型刽锤、文件型镊尺。
要消除風險就要對輸入的數(shù)據(jù)進行檢查,對于Web應用來說并思,檢查的位置主要是前端和后端庐氮。前端檢查只能防止正常狀況,沒法防止使用工具宋彼、程序繞開檢查直接把數(shù)據(jù)發(fā)送給服務器弄砍。
輸入檢查
防止輸入注入型攻擊。所有的輸入數(shù)據(jù)都要檢查输涕,除了前端檢查外音婶,為防止使用工具、程序繞開前端檢查直接把數(shù)據(jù)發(fā)送給服務器莱坎,后端也要檢查所有輸入數(shù)據(jù)衣式。
依據(jù)產品文檔的要求進行合法性檢查,數(shù)值型,手機號碴卧,時間弱卡,郵箱等
檢查文本型是否含控制字符,過濾掉控制字符
檢查文本型的長度
URL字符串轉義住册,使用urlencode函數(shù)處理
文件上傳
防止文件注入型攻擊婶博。
1、文件上傳目錄設置成不可執(zhí)行
2荧飞、判斷文件類型凡人。結合MIME type與文件擴展名,設置文件類型白名單叹阔。對于圖片文件挠轴,可以利用圖片庫函數(shù)深層次檢查是否真是圖片。
3条获、重命名文件名。
4蒋歌、文件服務器使用獨立的域名帅掘。
輸出轉義
防止XSS(跨站腳本攻擊)。向頁面輸出的文本型數(shù)據(jù)進行html encode(轉義)堂油,即是將一些html中的特殊字符轉義成普通字符修档,比如 & 轉義成 & ,< 轉義成 < 府框,'與"都要轉義吱窝。對應的函數(shù):javascriptencode,php的htmlentities迫靖。
同理xml數(shù)據(jù)包里的字符串值使用xmlencode院峡,json數(shù)據(jù)包的字符串值使用jsonencode轉義。
XSS處理
XSS的本質是HTML注入系宜,用戶輸入的數(shù)據(jù)被當成Html代碼執(zhí)行了照激。
1、cookie使用HttpOnly限制
使得在客戶端的js代碼不能讀取cookie值盹牧,但是不能防止從HTTP header里得到cookie值俩垃。
2、輸出文本HTML轉義
對網頁上顯示的文本內容使用HtmlEncode轉義汰寓。js函數(shù):OWASP ESAPI中的encodeCharacter口柳。其它的如xmlencode、jsonencode等轉義函數(shù)有滑。
3跃闹、檢查輸入的URL
輸入的url添加上 http: 或者 https:,然后轉義輸出到網頁端
4、對傳入js函數(shù)的文本型參數(shù)值進行javascript轉義
先進行javascript轉義再進行HTML轉義辣卒。
總結如下:
SQL注入
預防辦法:數(shù)據(jù)與代碼分離掷贾,即不用字符串拼湊SQL語句,使用SQL預處理方法(參數(shù)使用占位符 ?)荣茫。
XST處理
XST(跨站追蹤)攻擊想帅,關閉Web 服務器的TRACE方法。
CSRF攻擊的防御
通常需要防御CSRF(Cross-Site Request Forgeries)攻擊的頁面是用戶登錄啡莉、修改/刪除確認港准、訂單確認等添加新數(shù)據(jù)、修改數(shù)據(jù)的頁面咧欣,此外此類頁面必須使用POST方式提交浅缸。
HTTP頭注入
替換HTTP頭字符值中的換行符。
Cookie安全
Cookie僅保存SessionId值魄咕,設置HttpOnly屬性為On衩椒,
用戶密碼安全
1、使用安全的bcrypt替代MD5哮兰,bcrypt會產生隨機鹽 salt
權限控制
1毛萌、SSO單點登錄。OpenID系統(tǒng)
2喝滞、Spring Security的實現(xiàn)-基于角色的訪問控制(Role-Based Access Control)RBAC
3阁将、基于數(shù)據(jù)的訪問控制。比如將用戶Id右遭、對象id修改成另一個存在的id做盅,如果沒有檢查當前登錄用戶是否是參數(shù)對應的id用戶,就會產生修改別的用戶數(shù)據(jù)的問題窘哈,也即是越權訪問吹榴。
4、OAuth授權滚婉。OAuth第三方開源庫
5腊尚、SessionId。sessionid加密處理