預防sql注入

前言:

這兩天作項目的時候發現不少小地方沒有注意js或者sql注入,平時登陸都是md5加密,今天忽然發現記錄一下。正則表達式

所謂SQL注入,就是經過把SQL命令插入到Web表單提交或輸入域名或頁面請求的查詢字符串,最終達到欺騙服務器執行惡意的SQL命令sql

 

過程:

相似這種很簡單的頁面 ,可能sql語句寫法都以下:數據庫

select* form table where title ='活動' 服務器

可是懂點sql的人 ,能夠輸入' or ''=',工具

select* form table where title ='' or ''='' 加密

或者 ' or 1=1-- (後加一個空格)spa

select* form table where title ='' or 1=1-- ' (註釋掉後面的單引號)code

加上傳入參數默認的兩個包裹單引號,sql被解析了成了一個恆等式orm

因而結果以下,查詢出了全部數據blog

升級:藉助異常獲取信息

破解表名:

and (select count(*) from 表名)<>0       (不等於0,判斷是否正確)

破解列名:

and (select count(列名) from 表名)<>0

返回正確的,那麼寫的表名或列名就是正確

 

預防:

1.對用戶的輸入進行 校驗,能夠經過正則表達式,對單引號和雙"-"進行轉換,控制數據類型等。
2.不要使用動態拼裝sql,能夠使用 參數化的sql或者直接使用 存儲過程進行數據查詢存取
 
        String sql = "select id, no from user where id=?";
        PreparedStatement ps = conn.prepareStatement(sql);
        ps.setInt(1, id);
        ps.executeQuery();

採用sql語句預編譯和綁定變量,是防護sql注入的最佳方法  

PreparedStatement,就會將sql語句:"select id, no from user where id=?" 預先編譯好,也就是SQL引擎會預先進行語法分析產生語法樹生成執行計劃

也就是說,後面你輸入的參數,不管你輸入的是什麼,都不會影響該sql語句的 語法結構

3.md5 加密
4.不要使用管理員 權限的數據庫鏈接,爲每一個應用使用單獨的權限有限的數據庫鏈接。
5. 自定義錯誤信息對原始錯誤信息進行包裝
6. 輔助檢驗工具
相關文章
相關標籤/搜索