SQL中的安全問題
1.SQL注入
demo1:
SELECT * FROM user WHERE username = ? AND password = ? ;
http://127.0.0.1/injection/user.do?username=angel' or '1=1
http://127.0.0.1/injection/user.do?username=angel'/*
http://127.0.0.1/injection/user.do?username=angel'#
其中 or 1=1 保證sql爲真;而 /* 以及 # 會將後面的SQL註釋掉,使得SQL也爲真,致使SQL沒有起到須要密碼的目的,將數據返回.
2.開發時,防止SQL注入
a.使用Java , JSP進行開發時,應採用PrepareStatement + Bind-variable方式防止SQL注入.
儘可能不要使用拼接SQL的方式.
demo :
...
String sql = "SELECT * FROM users u where u.id = ? and u.password = ?";
PrepareStatement ps = connection.prepareStatement(sql);
ps.setInt(1,id);
ps.setString(2.pwd);
ResultSet rs = ps.executeQuery();
...
b,使用應用程序提供的轉換函數
略,這裏沒有提到 java 相關的api .
c.自定義函數 進行校驗
輸入驗證的途徑能夠分爲如下幾種:
整理數據使之變得有效;
拒絕已知的非法輸入;
只接受已知的合法輸入;
目前最好的辦法就是對用戶提交或者可能改變的數據進行簡單分類,分別應用正則表達式來對用戶提供的輸入數據進行嚴格的檢測和驗證.
已知非法的字符有 :
' ,
; ,
= ,
( ,
) ,
/* ,
*/ ,
% ,
+ ,
空字符串 ,
> , < , -
- , [ ,
]
同時要過濾它們的十六進制表示"%XX",由此能夠構造以下正則表達式:
(|\'|(\%27)|\;|(\%3b)|\=|(\%3d)|\(|(\%28)|\)|(\%29)|(\/*)|(\%2f%2a)|(\*/)|(\%2a%2f)|\+|(\%2b)|\<|(\%3c)|\>|(\%3e)|\(--))|\[|\%5b|\]|\%5d)