如何防止sql注入(全)

定義:以用戶或者外部的輸入動態構造SQL查詢的命令,將可能改變SQL查詢語句本來的語義,從而導致執行任意的SQL命令,泄露或者篡改SQL數據庫的敏感數據。

基本例子:
原sql:String name = request.getParameter("name"); … ResultSet rs = conn.createStatement().executeQuery("SELECT Data FROM Users WHERE Name = '"+name+"'");

篡改後:ResultSet rs = conn.createStatement().executeQuery("SELECT Data FROM Users WHERE Name = ‘joe’ or ‘1’ = ‘1’);


有操作風險的Api函數:
–Statement.execute*
–PreparedStatement.execute*
–CallableStatement.execute*
–JdbcTemplate.query*
–JdbcTemplate.insert
–JdbcTemplate.update
–JdbcTemplate.delete
–JdbcTemplate.execute
–Session.createQuery
– Session.createSQLQuery
–Session.createFilter"


防治思想:
1、輸入校驗:做好規範的校驗工作,比如搜索框不能輸入sql語句等;
2、權限控制:在創建一個SQL數據庫的用戶帳戶時,要遵循最低權限法則。用戶應只擁有使用其帳戶的必要的最低特權。如果系統顯示需要用戶可以讀取和修改自己的數據,那麼應該限制其特權,使他們無法讀取/編寫別人的數據。
3、重複校驗:在服務器端重複客戶端所進行的所有過濾。(黑名單驗證和白名單驗證)
例子:public static void main(String[] args) throws IOException {
String regex = "^[0-9\\-\\. ]+$";
Pattern p = Pattern.compile(regex);
for (int i=0; i < args.length; i++) {
String num = args[i].trim();
Matcher m = p.matcher(num);
if (m.matches()) {
dialNumber(num);
} else {
System.out.println("Not a valid phone number.");
}
}
}
4、動態參數:應使用prepared statements語句綁定變量來執行SQL字符串。沒有使用prepared statements語句綁定變量可能很容易受到攻擊。
使用嚴格的白名單型來檢查可以用於SOL命令的所有用戶輸入數據。而不是避開元字符集,完全禁止元字符纔是最安全的。原因是:後期對已經被輸入數據庫的數據進行使用可能將之前使用過的元字符丟棄。應該對request中期望的安全的字符集進行更爲精細地定義。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章