1.SQL注入:程序向後臺數據庫傳遞SQL時,用戶提交的數據直接拼接到SQL語句中並執行,從而導入SQL注入攻擊。php
字符型注入:黑色部分爲拼接的問題參數html
select * from t_user where name='test' or '1' = '1';
數字型注入:黑色部分爲拼接的問題參數(對於強類型語言,字符串轉int類型會拋異常。因此這種注入方式通常出如今php等弱類型語言上)前端
select * from t_user where id=1;drop table t_userinfo;
搜索型注入:對錶名進行猜想web
select * from t_user where userName like ‘%test%’ and 1=2 union select 1,2 from t_admin';
修復方法:正則表達式
a、在mybatis中使用#把參數當作一個字符串,不能使用$符號sql
b、在JDBC中使用預編譯的方式對參數進行綁定,詳細以下:數據庫
String userName = request.getParameter("userName"); String sql = "select * from t_user where userName = ?"; JdbcConnection conn = new JdbcConnection(); PreparedStatement pstmt = conn.preparedStatement(sql); pstmt.setString(1,userName);
二、XSS跨站腳本攻擊(惡意將腳本代碼植入到供其餘用戶使用的頁面中)後端
反射型:通過後端,不通過數據庫瀏覽器
存儲型:通過後端通過數據庫安全
DOM型:基於文檔對象模型DOM,經過控制url參數觸發
修復方法:
a、後臺設置XSSFilter,繼承RequestServletWrapper類,對前端請求中的可控參數進行過濾
b、服務端設置Http-only安全屬性,使瀏覽器控制cookie不被泄露
c、對引入到DOM中的參數使用htmlEncodeByRegExp編碼,在對應的展現框中用htmlDecodeByRegExp進行解碼(比較經常使用)
var HtmlUtil = { /*1.用正則表達式實現html轉碼*/ htmlEncodeByRegExp:function (str){ var s = ""; if(str.length == 0) return ""; s = str.replace(/&/g,"&"); s = s.replace(/</g,"<"); s = s.replace(/>/g,">"); s = s.replace(/ /g," "); s = s.replace(/\'/g,"'"); s = s.replace(/\"/g,"""); return s; }, /*2.用正則表達式實現html解碼*/ htmlDecodeByRegExp:function (str){ var s = ""; if(str.length == 0) return ""; s = str.replace(/&/g,"&"); s = s.replace(/</g,"<"); s = s.replace(/>/g,">"); s = s.replace(/ /g," "); s = s.replace(/'/g,"\'"); s = s.replace(/"/g,"\""); return s; } };
三、敏感信息泄露
程序形成的泄露:
一、服務端返回冗餘敏感數據:用戶只申請了單個帳戶的信息,卻返回了多個用戶的信息
二、將敏感信息直接寫在前端頁面的註釋中
三、寫在配置文件的密碼未進行編碼處理
四、請求參數敏感信息未脫敏處理(能夠將數據在前端用RSA加密,後臺在進行解密)
五、前端展現的敏感信息,沒有在後臺進行脫敏處理(後臺對數據進行處理,能夠將中間部分使用*號代替)
六、越權
四、越權:攻擊者可以執行自己沒有資格執行的權限
水平越權:權限類型不變,權限Id變化(同等角色下的用戶,不但可以訪問本身私有的數據,還能訪問其餘人私有的數據)
垂直越權:權限ID不變,權限類型變化(即低權限的角色經過一些途徑,得到高權限的能力)
交叉越權:上面二者的交集
修復方法:
一、根據請求攜帶的用戶信息進行鑑權操做,對當前請求攜帶的用戶信息進行用戶角色和數據權限匹配。每個重要操做的功能、分步操做的每一個階段都進行權限判斷。權限不足就中斷操做。
五、文件下載:
任意文件下載:下載服務器的任意文件,web業務的代碼,服務器和系統的具體配置信息,也能夠下載數據庫的配置信息,以及對內網的信息探測等等
文件越權下載:
修復方法:
一、針對任意文件下載的修復,增長當前請求下載的文件上一級的絕對路徑同配置文件中容許下載的路徑直接的比較(file.getCanonicalFile().getParent()獲取上一級的絕對路徑)
if(!file.getCanonicalFile().getParent().equals(new File(Constants.TMP_PATH).getCanonicalPath())){ return ; }
二、文件越權下載:容許下載以前對請求所帶的用戶信息進行判斷,擁有足夠的權限菜容許下載。
六、文件上傳:網絡攻擊者上傳了一個可執行的文件到服務器並執行。這裏上傳的文件能夠是木馬,病毒,惡意腳本或者WebShell等。
修復方法:
一、客戶端、服務端白名單驗證(不建議用黑名單),客戶端的校驗不夠安全,很容易被繞過。
String fileName = file.getOriginalFilename(); String extName = fileName.subString(fileName.lastIndexof(".")+1);
獲取上傳文件的後綴名,並同白名單上的後綴名進行比較,包含在白名單上則容許經過,不包含則直接中斷請求。
二、MiME類型檢測:文件上傳時瀏覽器會在Header中添加MIMETYPE識別文件類型,服務端要對此進行檢測。
String mime = file.getContentType();//獲取文件的ContentType類型值
同白名單上的contentType類型名進行比較,包含在白名單上則容許經過,不包含則直接中斷請求。
三、文件內容檢測:用不一樣的方法將不一樣的文件內容流的進行讀取。
BufferedImage image = ImageIO.read(file.getInputStream());
七、CSRF:跨站請求僞造,完成CSRF攻擊,須要完成兩個步驟:一、登陸受信任的網站A,並在本地生成cookie;二、在不登出A的狀況下,訪問危險網站B
CSRF本質緣由:Web的隱式身份驗證機制。Web的身份驗證機制雖然能夠保證請求來自用戶的瀏覽器,可是沒法保證該請求時用戶批准發送的。
修復方法:
CSRF Token校驗:在頁面中添加一個hidden用於存放token字段,請求發送時攜帶token到服務端,服務端校驗token值是否準確。不許確直接中斷操做