這兩天作項目的時候發現不少小地方沒有注意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
返回正確的,那麼寫的表名或列名就是正確
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語句的 語法結構了